diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp index 2bf70c715d..9fe5801682 100644 --- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp @@ -87,6 +87,7 @@ using aidl::android::media::audio::common::AudioDeviceDescription; using aidl::android::media::audio::common::AudioDeviceType; using aidl::android::media::audio::common::AudioDualMonoMode; using aidl::android::media::audio::common::AudioFormatType; +using aidl::android::media::audio::common::AudioGainConfig; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioLatencyMode; @@ -450,6 +451,7 @@ class AudioCoreModuleBase { // This is implemented by the 'StreamFixture' utility class. static constexpr int kNegativeTestBufferSizeFrames = 256; static constexpr int kDefaultLargeBufferSizeFrames = 48000; + static constexpr int32_t kAidlVersion3 = 3; void SetUpImpl(const std::string& moduleName, bool setUpDebug = true) { ASSERT_NO_FATAL_FAILURE(ConnectToService(moduleName, setUpDebug)); @@ -478,6 +480,7 @@ class AudioCoreModuleBase { if (setUpDebug) { ASSERT_NO_FATAL_FAILURE(SetUpDebug()); } + ASSERT_TRUE(module->getInterfaceVersion(&aidlVersion).isOk()); } void RestartService() { @@ -490,6 +493,7 @@ class AudioCoreModuleBase { if (setUpDebug) { ASSERT_NO_FATAL_FAILURE(SetUpDebug()); } + ASSERT_TRUE(module->getInterfaceVersion(&aidlVersion).isOk()); } void SetUpDebug() { @@ -577,6 +581,7 @@ class AudioCoreModuleBase { std::unique_ptr debug; std::vector initialPorts; std::vector initialRoutes; + int32_t aidlVersion; }; class WithDevicePortConnectedState { @@ -1821,6 +1826,46 @@ TEST_P(AudioCoreModule, SetAudioPortConfigInvalidPortConfigId) { } } +TEST_P(AudioCoreModule, SetAudioPortConfigInvalidPortAudioGain) { + if (aidlVersion < kAidlVersion3) { + GTEST_SKIP() << "Skip for audio HAL version lower than " << kAidlVersion3; + } + std::vector ports; + ASSERT_IS_OK(module->getAudioPorts(&ports)); + bool atLeastOnePortWithNonemptyGain = false; + for (const auto port : ports) { + AudioPortConfig portConfig; + portConfig.portId = port.id; + if (port.gains.empty()) { + continue; + } + atLeastOnePortWithNonemptyGain = true; + int index = 0; + ASSERT_NE(0, port.gains[index].stepValue) << "Invalid audio port config gain step 0"; + portConfig.gain->index = index; + AudioGainConfig invalidGainConfig; + + int invalidGain = port.gains[index].maxValue + port.gains[index].stepValue; + invalidGainConfig.values.push_back(invalidGain); + portConfig.gain.emplace(invalidGainConfig); + bool applied = true; + AudioPortConfig suggestedConfig; + EXPECT_STATUS(EX_ILLEGAL_ARGUMENT, + module->setAudioPortConfig(portConfig, &suggestedConfig, &applied)) + << "invalid port gain " << invalidGain << " lower than min gain"; + + invalidGain = port.gains[index].minValue - port.gains[index].stepValue; + invalidGainConfig.values[0] = invalidGain; + portConfig.gain.emplace(invalidGainConfig); + EXPECT_STATUS(EX_ILLEGAL_ARGUMENT, + module->setAudioPortConfig(portConfig, &suggestedConfig, &applied)) + << "invalid port gain " << invalidGain << "higher than max gain"; + } + if (!atLeastOnePortWithNonemptyGain) { + GTEST_SKIP() << "No audio port contains non-empty gain configuration"; + } +} + TEST_P(AudioCoreModule, TryConnectMissingDevice) { // Limit checks to connection types that are known to be detectable by HAL implementations. static const std::set kCheckedConnectionTypes{