diff options
author | Daniel Norman <danielnorman@google.com> | 2021-02-08 11:11:06 -0800 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2021-02-08 14:07:55 -0800 |
commit | f86b976dba9b016816efa57156e791fffd498d64 (patch) | |
tree | 62e68f2885e6a7a73bf3386e8459f8fe98528ade /audio/common/all-versions/default/tests/hidlutils_tests.cpp | |
parent | a0da4d07b75fa61fcb4f5648ba304cbf4ac50f6a (diff) | |
parent | 7fd5ae363319c3d8fa9128c39075ea82799989ab (diff) |
Merge SP1A.210208.001
Change-Id: I0c596171de3bcead62935db7388b784e55444080
Diffstat (limited to 'audio/common/all-versions/default/tests/hidlutils_tests.cpp')
-rw-r--r-- | audio/common/all-versions/default/tests/hidlutils_tests.cpp | 409 |
1 files changed, 345 insertions, 64 deletions
diff --git a/audio/common/all-versions/default/tests/hidlutils_tests.cpp b/audio/common/all-versions/default/tests/hidlutils_tests.cpp index fef88b450b..40fc5c81c6 100644 --- a/audio/common/all-versions/default/tests/hidlutils_tests.cpp +++ b/audio/common/all-versions/default/tests/hidlutils_tests.cpp @@ -35,30 +35,27 @@ namespace xsd { using namespace ::android::audio::policy::configuration::V7_0; } -static constexpr audio_channel_mask_t kInvalidHalChannelMask = - static_cast<audio_channel_mask_t>(0xFFFFFFFFU); +static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID; static constexpr audio_content_type_t kInvalidHalContentType = static_cast<audio_content_type_t>(0xFFFFFFFFU); static constexpr audio_devices_t kInvalidHalDevice = static_cast<audio_devices_t>(0xFFFFFFFFU); -static constexpr audio_format_t kInvalidHalFormat = static_cast<audio_format_t>(0xFFFFFFFFU); +static constexpr audio_format_t kInvalidHalFormat = AUDIO_FORMAT_INVALID; static constexpr audio_gain_mode_t kInvalidHalGainMode = static_cast<audio_gain_mode_t>(0xFFFFFFFFU); -static constexpr audio_source_t kInvalidHalSource = static_cast<audio_source_t>(0xFFFFFFFFU); +// AUDIO_SOURCE_INVALID is framework-only. +static constexpr audio_source_t kInvalidHalSource = static_cast<audio_source_t>(-1); static constexpr audio_stream_type_t kInvalidHalStreamType = static_cast<audio_stream_type_t>(0xFFFFFFFFU); static constexpr audio_usage_t kInvalidHalUsage = static_cast<audio_usage_t>(0xFFFFFFFFU); TEST(HidlUtils, ConvertInvalidChannelMask) { AudioChannelMask invalid; - EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskFromHal(AUDIO_CHANNEL_INVALID, - false /*isInput*/, &invalid)); - EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskFromHal(AUDIO_CHANNEL_INVALID, true /*isInput*/, - &invalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskFromHal(kInvalidHalChannelMask, false /*isInput*/, &invalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskFromHal(kInvalidHalChannelMask, true /*isInput*/, &invalid)); audio_channel_mask_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskToHal("", &halInvalid)); // INVALID channel mask is not in XSD thus it's not allowed for transfer over HIDL. EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskToHal("AUDIO_CHANNEL_INVALID", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioChannelMaskToHal("random string", &halInvalid)); @@ -148,40 +145,241 @@ TEST(HidlUtils, ConvertChannelMasksFromHal) { } } +static AudioConfigBase generateValidConfigBase(bool isInput) { + AudioConfigBase configBase; + configBase.sampleRateHz = 44100; + configBase.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); + configBase.channelMask = isInput ? toString(xsd::AudioChannelMask::AUDIO_CHANNEL_IN_STEREO) + : toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); + return configBase; +} + TEST(HidlUtils, ConvertInvalidConfigBase) { AudioConfigBase invalid; - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseFromHal({.sample_rate = 0, - .channel_mask = kInvalidHalChannelMask, - .format = kInvalidHalFormat}, - false /*isInput*/, &invalid)); - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseFromHal({.sample_rate = 0, - .channel_mask = kInvalidHalChannelMask, - .format = kInvalidHalFormat}, - true /*isInput*/, &invalid)); + audio_config_base_t halInvalidChannelMask = AUDIO_CONFIG_BASE_INITIALIZER; + halInvalidChannelMask.channel_mask = kInvalidHalChannelMask; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseFromHal(halInvalidChannelMask, false /*isInput*/, + &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseFromHal(halInvalidChannelMask, true /*isInput*/, &invalid)); + audio_config_base_t halInvalidFormat = AUDIO_CONFIG_BASE_INITIALIZER; + halInvalidFormat.format = kInvalidHalFormat; + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseFromHal(halInvalidFormat, false /*isInput*/, &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseFromHal(halInvalidFormat, true /*isInput*/, &invalid)); + audio_config_base_t halInvalid; - invalid.sampleRateHz = 0; - invalid.channelMask = "random string"; - invalid.format = "random string"; - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseToHal(invalid, &halInvalid)); + AudioConfigBase invalidChannelMask = generateValidConfigBase(false /*isInput*/); + invalidChannelMask.channelMask = "random string"; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseToHal(invalidChannelMask, &halInvalid)); + AudioConfigBase invalidFormat = generateValidConfigBase(false /*isInput*/); + invalidFormat.format = "random string"; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseToHal(invalidFormat, &halInvalid)); +} + +TEST(HidlUtils, ConvertConfigBaseDefault) { + audio_config_base_t halBaseDefault = AUDIO_CONFIG_BASE_INITIALIZER; + AudioConfigBase baseDefaultOut, baseDefaultIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseFromHal(halBaseDefault, false /*isInput*/, + &baseDefaultOut)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigBaseFromHal(halBaseDefault, true /*isInput*/, &baseDefaultIn)); + EXPECT_EQ(baseDefaultOut, baseDefaultIn); + audio_config_base_t halBaseDefaultBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseToHal(baseDefaultOut, &halBaseDefaultBack)); + EXPECT_EQ(halBaseDefault.sample_rate, halBaseDefaultBack.sample_rate); + EXPECT_EQ(halBaseDefault.channel_mask, halBaseDefaultBack.channel_mask); + EXPECT_EQ(halBaseDefault.format, halBaseDefaultBack.format); } TEST(HidlUtils, ConvertConfigBase) { - AudioConfigBase configBase; - configBase.sampleRateHz = 44100; - configBase.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); - configBase.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); - audio_config_base_t halConfigBase; - EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseToHal(configBase, &halConfigBase)); - AudioConfigBase configBaseBack; + AudioConfigBase configBaseOut = generateValidConfigBase(false /*isInput*/); + audio_config_base_t halConfigBaseOut; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseToHal(configBaseOut, &halConfigBaseOut)); + AudioConfigBase configBaseOutBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseFromHal(halConfigBaseOut, false /*isInput*/, + &configBaseOutBack)); + EXPECT_EQ(configBaseOut, configBaseOutBack); + + AudioConfigBase configBaseIn = generateValidConfigBase(true /*isInput*/); + audio_config_base_t halConfigBaseIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseToHal(configBaseIn, &halConfigBaseIn)); + AudioConfigBase configBaseInBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseFromHal(halConfigBaseIn, true /*isInput*/, + &configBaseInBack)); + EXPECT_EQ(configBaseIn, configBaseInBack); +} + +TEST(HidlUtils, ConvertInvalidConfigBaseOptional) { + AudioConfigBaseOptional invalid; + audio_config_base_t halInvalidChannelMask = AUDIO_CONFIG_BASE_INITIALIZER; + halInvalidChannelMask.channel_mask = kInvalidHalChannelMask; + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidChannelMask, false /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, true /*channelMaskSpecified*/, &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidChannelMask, true /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, true /*channelMaskSpecified*/, &invalid)); + // Unspecified invalid values are ignored + AudioConfigBaseOptional unspecified; + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidChannelMask, false /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &unspecified)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidChannelMask, true /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &unspecified)); + audio_config_base_t halInvalidFormat = AUDIO_CONFIG_BASE_INITIALIZER; + halInvalidFormat.format = kInvalidHalFormat; + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidFormat, false /*isInput*/, true /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidFormat, true /*isInput*/, true /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &invalid)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidFormat, false /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &unspecified)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigBaseOptionalFromHal( + halInvalidFormat, true /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, &unspecified)); + + audio_config_base_t halInvalid; + AudioConfigBaseOptional invalidChannelMask; + bool formatSpecified, sampleRateSpecified, channelMaskSpecified; + invalidChannelMask.channelMask.value("random string"); + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigBaseOptionalToHal( + invalidChannelMask, &halInvalid, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + AudioConfigBaseOptional invalidFormat; + invalidFormat.format.value("random string"); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigBaseOptionalToHal(invalidFormat, &halInvalid, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); +} + +TEST(HidlUtils, ConvertConfigBaseOptionalDefault) { + audio_config_base_t halBaseDefault = AUDIO_CONFIG_BASE_INITIALIZER; + AudioConfigBaseOptional baseDefaultUnspecOut, baseDefaultUnspecIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halBaseDefault, false /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, + &baseDefaultUnspecOut)); + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halBaseDefault, true /*isInput*/, false /*formatSpecified*/, + false /*sampleRateSpecified*/, false /*channelMaskSpecified*/, + &baseDefaultUnspecIn)); + EXPECT_EQ(baseDefaultUnspecOut, baseDefaultUnspecIn); + audio_config_base_t halBaseDefaultUnspecBack = AUDIO_CONFIG_BASE_INITIALIZER; + bool formatSpecified, sampleRateSpecified, channelMaskSpecified; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalToHal( + baseDefaultUnspecOut, &halBaseDefaultUnspecBack, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + EXPECT_FALSE(formatSpecified); + EXPECT_FALSE(sampleRateSpecified); + EXPECT_FALSE(channelMaskSpecified); + EXPECT_EQ(halBaseDefault.sample_rate, halBaseDefaultUnspecBack.sample_rate); + EXPECT_EQ(halBaseDefault.channel_mask, halBaseDefaultUnspecBack.channel_mask); + EXPECT_EQ(halBaseDefault.format, halBaseDefaultUnspecBack.format); + + AudioConfigBaseOptional baseDefaultSpecOut, baseDefaultSpecIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halBaseDefault, false /*isInput*/, true /*formatSpecified*/, + true /*sampleRateSpecified*/, true /*channelMaskSpecified*/, + &baseDefaultSpecOut)); + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halBaseDefault, true /*isInput*/, true /*formatSpecified*/, + true /*sampleRateSpecified*/, true /*channelMaskSpecified*/, + &baseDefaultSpecIn)); + EXPECT_EQ(baseDefaultSpecOut, baseDefaultSpecIn); + audio_config_base_t halBaseDefaultSpecBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalToHal( + baseDefaultSpecOut, &halBaseDefaultSpecBack, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + EXPECT_TRUE(formatSpecified); + EXPECT_TRUE(sampleRateSpecified); + EXPECT_TRUE(channelMaskSpecified); + EXPECT_EQ(halBaseDefault.sample_rate, halBaseDefaultSpecBack.sample_rate); + EXPECT_EQ(halBaseDefault.channel_mask, halBaseDefaultSpecBack.channel_mask); + EXPECT_EQ(halBaseDefault.format, halBaseDefaultSpecBack.format); +} + +TEST(HidlUtils, ConvertConfigBaseOptionalEmpty) { + AudioConfigBaseOptional empty; + bool formatSpecified, sampleRateSpecified, channelMaskSpecified; + audio_config_base_t halEmpty = AUDIO_CONFIG_BASE_INITIALIZER; EXPECT_EQ(NO_ERROR, - HidlUtils::audioConfigBaseFromHal(halConfigBase, false /*isInput*/, &configBaseBack)); - EXPECT_EQ(configBase, configBaseBack); + HidlUtils::audioConfigBaseOptionalToHal(empty, &halEmpty, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + EXPECT_FALSE(formatSpecified); + EXPECT_FALSE(sampleRateSpecified); + EXPECT_FALSE(channelMaskSpecified); + AudioConfigBaseOptional emptyOutBack, emptyInBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halEmpty, false /*isInput*/, formatSpecified, sampleRateSpecified, + channelMaskSpecified, &emptyOutBack)); + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halEmpty, true /*isInput*/, formatSpecified, sampleRateSpecified, + channelMaskSpecified, &emptyInBack)); + EXPECT_EQ(emptyOutBack, emptyInBack); + EXPECT_EQ(empty, emptyOutBack); +} + +TEST(HidlUtils, ConvertConfigBaseOptional) { + AudioConfigBase validBaseOut = generateValidConfigBase(false /*isInput*/); + AudioConfigBaseOptional configBaseOut; + configBaseOut.format.value(validBaseOut.format); + configBaseOut.sampleRateHz.value(validBaseOut.sampleRateHz); + configBaseOut.channelMask.value(validBaseOut.channelMask); + audio_config_base_t halConfigBaseOut; + bool formatSpecified, sampleRateSpecified, channelMaskSpecified; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalToHal( + configBaseOut, &halConfigBaseOut, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + EXPECT_TRUE(formatSpecified); + EXPECT_TRUE(sampleRateSpecified); + EXPECT_TRUE(channelMaskSpecified); + AudioConfigBaseOptional configBaseOutBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halConfigBaseOut, false /*isInput*/, formatSpecified, + sampleRateSpecified, channelMaskSpecified, &configBaseOutBack)); + EXPECT_EQ(configBaseOut, configBaseOutBack); + + AudioConfigBase validBaseIn = generateValidConfigBase(true /*isInput*/); + AudioConfigBaseOptional configBaseIn; + configBaseIn.format.value(validBaseIn.format); + configBaseIn.sampleRateHz.value(validBaseIn.sampleRateHz); + configBaseIn.channelMask.value(validBaseIn.channelMask); + audio_config_base_t halConfigBaseIn; + formatSpecified = false; + sampleRateSpecified = false; + channelMaskSpecified = false; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalToHal( + configBaseIn, &halConfigBaseIn, &formatSpecified, + &sampleRateSpecified, &channelMaskSpecified)); + EXPECT_TRUE(formatSpecified); + EXPECT_TRUE(sampleRateSpecified); + EXPECT_TRUE(channelMaskSpecified); + AudioConfigBaseOptional configBaseInBack; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigBaseOptionalFromHal( + halConfigBaseIn, true /*isInput*/, formatSpecified, + sampleRateSpecified, channelMaskSpecified, &configBaseInBack)); + EXPECT_EQ(configBaseIn, configBaseInBack); } TEST(HidlUtils, ConvertInvalidContentType) { AudioContentType invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioContentTypeFromHal(kInvalidHalContentType, &invalid)); audio_content_type_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioContentTypeToHal("", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioContentTypeToHal("random string", &halInvalid)); } @@ -202,6 +400,7 @@ TEST(HidlUtils, ConvertInvalidDeviceType) { AudioDevice invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioDeviceTypeFromHal(kInvalidHalDevice, &invalid)); audio_devices_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioDeviceTypeToHal("", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioDeviceTypeToHal("random string", &halInvalid)); } @@ -233,6 +432,7 @@ TEST(HidlUtils, ConvertDeviceType) { // The enums module is too small to have unit tests on its own. TEST(HidlUtils, VendorExtension) { EXPECT_TRUE(xsd::isVendorExtension("VX_GOOGLE_VR_42")); + EXPECT_FALSE(xsd::isVendorExtension("")); EXPECT_FALSE(xsd::isVendorExtension("random string")); EXPECT_FALSE(xsd::isVendorExtension("VX_")); EXPECT_FALSE(xsd::isVendorExtension("VX_GOOGLE_$$")); @@ -347,6 +547,9 @@ TEST(HidlUtils, ConvertInvalidFormat) { AudioFormat invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioFormatFromHal(kInvalidHalFormat, &invalid)); audio_format_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioFormatToHal("", &halInvalid)); + // INVALID format is not in XSD thus it's not allowed for transfer over HIDL. + EXPECT_EQ(BAD_VALUE, HidlUtils::audioFormatToHal("AUDIO_FORMAT_INVALID", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioFormatToHal("random string", &halInvalid)); } @@ -357,8 +560,9 @@ TEST(HidlUtils, ConvertFormat) { AudioFormat formatBack; EXPECT_EQ(NO_ERROR, HidlUtils::audioFormatToHal(format, &halFormat)) << "Conversion of \"" << format << "\" failed"; - EXPECT_TRUE(audio_is_valid_format(halFormat)) - << "Converted format \"" << format << "\" is invalid"; + EXPECT_EQ(enumVal != xsd::AudioFormat::AUDIO_FORMAT_DEFAULT, + audio_is_valid_format(halFormat)) + << "Validity of \"" << format << "\" is not as expected"; EXPECT_EQ(NO_ERROR, HidlUtils::audioFormatFromHal(halFormat, &formatBack)) << "Conversion of format " << halFormat << " failed"; EXPECT_EQ(format, formatBack); @@ -430,6 +634,9 @@ TEST(HidlUtils, ConvertInvalidSource) { AudioSource invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioSourceFromHal(kInvalidHalSource, &invalid)); audio_source_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioSourceToHal("", &halInvalid)); + // INVALID source is not in XSD thus it's not allowed for transfer over HIDL. + EXPECT_EQ(BAD_VALUE, HidlUtils::audioSourceToHal("AUDIO_SOURCE_INVALID", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioSourceToHal("random string", &halInvalid)); } @@ -453,6 +660,7 @@ TEST(HidlUtils, ConvertInvalidStreamType) { AudioStreamType invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioStreamTypeFromHal(kInvalidHalStreamType, &invalid)); audio_stream_type_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioStreamTypeToHal("", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioStreamTypeToHal("random string", &halInvalid)); } @@ -524,6 +732,7 @@ TEST(HidlUtils, ConvertInvalidUsage) { AudioUsage invalid; EXPECT_EQ(BAD_VALUE, HidlUtils::audioUsageFromHal(kInvalidHalUsage, &invalid)); audio_usage_t halInvalid; + EXPECT_EQ(BAD_VALUE, HidlUtils::audioUsageToHal("", &halInvalid)); EXPECT_EQ(BAD_VALUE, HidlUtils::audioUsageToHal("random string", &halInvalid)); } @@ -543,7 +752,7 @@ TEST(HidlUtils, ConvertUsage) { TEST(HidlUtils, ConvertInvalidOffloadInfo) { AudioOffloadInfo invalid; audio_offload_info_t halInvalid = AUDIO_INFO_INITIALIZER; - halInvalid.channel_mask = AUDIO_CHANNEL_INVALID; + halInvalid.channel_mask = kInvalidHalChannelMask; halInvalid.format = kInvalidHalFormat; EXPECT_EQ(BAD_VALUE, HidlUtils::audioOffloadInfoFromHal(halInvalid, &invalid)); invalid.base.channelMask = "random string"; @@ -553,9 +762,7 @@ TEST(HidlUtils, ConvertInvalidOffloadInfo) { TEST(HidlUtils, ConvertOffloadInfo) { AudioOffloadInfo offloadInfo = {}; - offloadInfo.base.sampleRateHz = 44100; - offloadInfo.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); - offloadInfo.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); + offloadInfo.base = generateValidConfigBase(false /*isInput*/); offloadInfo.streamType = toString(xsd::AudioStreamType::AUDIO_STREAM_MUSIC); offloadInfo.bitRatePerSecond = 320; offloadInfo.durationMicroseconds = -1; @@ -574,33 +781,76 @@ TEST(HidlUtils, ConvertOffloadInfo) { TEST(HidlUtils, ConvertInvalidConfig) { AudioConfig invalid; - audio_config_t halInvalid = AUDIO_CONFIG_INITIALIZER; - halInvalid.channel_mask = AUDIO_CHANNEL_INVALID; - halInvalid.format = kInvalidHalFormat; - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigFromHal(halInvalid, false /*isInput*/, &invalid)); - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigFromHal(halInvalid, true /*isInput*/, &invalid)); - invalid.base.channelMask = "random string"; - invalid.base.format = "random string"; - EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigToHal(invalid, &halInvalid)); + audio_config_t halInvalidChannelMask = AUDIO_CONFIG_INITIALIZER; + halInvalidChannelMask.channel_mask = kInvalidHalChannelMask; + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigFromHal(halInvalidChannelMask, false /*isInput*/, &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigFromHal(halInvalidChannelMask, true /*isInput*/, &invalid)); + audio_config_t halInvalidFormat = AUDIO_CONFIG_INITIALIZER; + halInvalidFormat.format = kInvalidHalFormat; + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigFromHal(halInvalidFormat, false /*isInput*/, &invalid)); + EXPECT_EQ(BAD_VALUE, + HidlUtils::audioConfigFromHal(halInvalidFormat, true /*isInput*/, &invalid)); + + AudioConfig invalidChannelMask; + audio_config_t halInvalid; + invalidChannelMask.base.channelMask = "random string"; + invalidChannelMask.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_DEFAULT); + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigToHal(invalidChannelMask, &halInvalid)); + AudioConfig invalidFormat; + invalidFormat.base.format = "random string"; + invalidFormat.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_NONE); + EXPECT_EQ(BAD_VALUE, HidlUtils::audioConfigToHal(invalidFormat, &halInvalid)); +} + +TEST(HidlUtils, ConvertConfigDefault) { + audio_config_t halDefault = AUDIO_CONFIG_INITIALIZER; + AudioConfig defaultOut, defaultIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigFromHal(halDefault, false /*isInput*/, &defaultOut)); + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigFromHal(halDefault, true /*isInput*/, &defaultIn)); + EXPECT_EQ(defaultOut, defaultIn); + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigToHal(defaultOut, &halDefault)); + + // Note: empty channel mask and config are not valid values. + AudioConfig defaultCfg{}; + defaultCfg.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_NONE); + defaultCfg.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_DEFAULT); + audio_config_t halDefaultCfg; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigToHal(defaultCfg, &halDefaultCfg)); + AudioConfig defaultCfgBackOut, defaultCfgBackIn; + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigFromHal(halDefaultCfg, false /*isInput*/, &defaultCfgBackOut)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigFromHal(halDefaultCfg, true /*isInput*/, &defaultCfgBackIn)); + EXPECT_EQ(defaultCfgBackOut, defaultCfgBackIn); + EXPECT_EQ(defaultCfg, defaultCfgBackOut); } TEST(HidlUtils, ConvertConfig) { - AudioConfig config = {}; - config.base.sampleRateHz = 44100; - config.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); - config.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); - audio_config_t halConfig; - EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigToHal(config, &halConfig)); - AudioConfig configBack; - EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigFromHal(halConfig, false /*isInput*/, &configBack)); - EXPECT_EQ(config, configBack); + AudioConfig configOut{}; + configOut.base = generateValidConfigBase(false /*isInput*/); + audio_config_t halConfigOut; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigToHal(configOut, &halConfigOut)); + AudioConfig configOutBack; + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigFromHal(halConfigOut, false /*isInput*/, &configOutBack)); + EXPECT_EQ(configOut, configOutBack); + + AudioConfig configIn{}; + configIn.base = generateValidConfigBase(true /*isInput*/); + audio_config_t halConfigIn; + EXPECT_EQ(NO_ERROR, HidlUtils::audioConfigToHal(configIn, &halConfigIn)); + AudioConfig configInBack; + EXPECT_EQ(NO_ERROR, + HidlUtils::audioConfigFromHal(halConfigIn, true /*isInput*/, &configInBack)); + EXPECT_EQ(configIn, configInBack); } TEST(HidlUtils, ConvertConfigWithOffloadInfo) { AudioConfig config = {}; - config.base.sampleRateHz = 44100; - config.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); - config.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); + config.base = generateValidConfigBase(false /*isInput*/); config.offloadInfo.info( AudioOffloadInfo{.base = config.base, .streamType = toString(xsd::AudioStreamType::AUDIO_STREAM_MUSIC), @@ -655,18 +905,18 @@ TEST(HidlUtils, ConvertInvalidAudioPortConfig) { halInvalid.type = AUDIO_PORT_TYPE_MIX; halInvalid.role = AUDIO_PORT_ROLE_NONE; // note: this is valid. halInvalid.config_mask = AUDIO_PORT_CONFIG_CHANNEL_MASK; - halInvalid.channel_mask = AUDIO_CHANNEL_INVALID; + halInvalid.channel_mask = kInvalidHalChannelMask; EXPECT_EQ(BAD_VALUE, HidlUtils::audioPortConfigFromHal(halInvalid, &invalid)); - invalid.base.channelMask = "random string"; + invalid.base.channelMask.value("random string"); EXPECT_EQ(BAD_VALUE, HidlUtils::audioPortConfigToHal(invalid, &halInvalid)); } TEST(HidlUtils, ConvertAudioPortConfig) { AudioPortConfig config = {}; config.id = 42; - config.base.sampleRateHz = 44100; - config.base.channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); - config.base.format = toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT); + config.base.sampleRateHz.value(44100); + config.base.channelMask.value(toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO)); + config.base.format.value(toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT)); config.gain.config({}); config.gain.config().channelMask = toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO); config.ext.device({}); @@ -734,7 +984,7 @@ TEST(HidlUtils, ConvertInvalidAudioTags) { {std::string(AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1, HidlUtils::sAudioTagSeparator)}}; EXPECT_EQ(BAD_VALUE, HidlUtils::audioTagsToHal(tagSeparator, halTag)); - hidl_vec<AudioTag> notExtensions = {{"random string", "VX_", "VX_GOOGLE_$$"}}; + hidl_vec<AudioTag> notExtensions = {{"", "random string", "VX_", "VX_GOOGLE_$$"}}; EXPECT_EQ(BAD_VALUE, HidlUtils::audioTagsToHal(notExtensions, halTag)); } @@ -743,20 +993,51 @@ TEST(HidlUtils, ConvertAudioTags) { char halEmptyTags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE] = {}; EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsToHal(emptyTags, halEmptyTags)); hidl_vec<AudioTag> emptyTagsBack; - EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsFromHal(halEmptyTags, &emptyTagsBack)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioTagsFromHal(HidlUtils::splitAudioTags(halEmptyTags), &emptyTagsBack)); EXPECT_EQ(emptyTags, emptyTagsBack); hidl_vec<AudioTag> oneTag = {{"VX_GOOGLE_VR"}}; char halOneTag[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE] = {}; EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsToHal(oneTag, halOneTag)); hidl_vec<AudioTag> oneTagBack; - EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsFromHal(halOneTag, &oneTagBack)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioTagsFromHal(HidlUtils::splitAudioTags(halOneTag), &oneTagBack)); EXPECT_EQ(oneTag, oneTagBack); hidl_vec<AudioTag> twoTags = {{"VX_GOOGLE_VR_42", "VX_GOOGLE_1E100"}}; char halTwoTags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE] = {}; EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsToHal(twoTags, halTwoTags)); hidl_vec<AudioTag> twoTagsBack; - EXPECT_EQ(NO_ERROR, HidlUtils::audioTagsFromHal(halTwoTags, &twoTagsBack)); + EXPECT_EQ(NO_ERROR, + HidlUtils::audioTagsFromHal(HidlUtils::splitAudioTags(halTwoTags), &twoTagsBack)); EXPECT_EQ(twoTags, twoTagsBack); } + +template <typename T> +class FilterTest : public ::testing::Test {}; +using FilterTestTypeParams = ::testing::Types<hidl_vec<AudioTag>, std::vector<std::string>>; +TYPED_TEST_SUITE(FilterTest, FilterTestTypeParams); + +TYPED_TEST(FilterTest, FilterOutNonVendorTags) { + TypeParam emptyTags; + EXPECT_EQ(emptyTags, HidlUtils::filterOutNonVendorTags(emptyTags)); + + TypeParam allVendorTags = {{"VX_GOOGLE_VR_42", "VX_GOOGLE_1E100"}}; + EXPECT_EQ(allVendorTags, HidlUtils::filterOutNonVendorTags(allVendorTags)); + + TypeParam oneVendorTag = {{"", "VX_GOOGLE_VR", "random_string"}}; + TypeParam oneVendorTagOnly = HidlUtils::filterOutNonVendorTags(oneVendorTag); + EXPECT_EQ(1, oneVendorTagOnly.size()); + EXPECT_EQ(oneVendorTag[1], oneVendorTagOnly[0]); + + // The vendor extension isn't valid, however it must not be filtered out + // so the converter can detect the issue. + TypeParam oneMaybeVendorTag = {{"", "random string", "VX_GOOGLE_$$"}}; + TypeParam oneMaybeVendorTagOnly = HidlUtils::filterOutNonVendorTags(oneMaybeVendorTag); + EXPECT_EQ(1, oneMaybeVendorTagOnly.size()); + EXPECT_EQ(oneMaybeVendorTag[2], oneMaybeVendorTagOnly[0]); + + TypeParam noVendorTags = {{"", "random string", "V_"}}; + EXPECT_EQ(emptyTags, HidlUtils::filterOutNonVendorTags(noVendorTags)); +} |