Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dd9a6ba authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

audio: Centralize audio configuration paths specification

The list of possible paths for the audio configuration
files is now retrieved using audio_get_configuration_paths()
function. All duplicated lists of known configuration
directories have been removed.

Bug: 153680356
Test: atest VtsHalAudioV6_0TargetTest \
            VtsHalAudioPolicyV1_0TargetTest \
            VtsHalAudioEffectV6_0TargetTest
Change-Id: I1e40fdf8d6e3a5ac339f7f138f62063bb87bd3da
Merged-In: I1e40fdf8d6e3a5ac339f7f138f62063bb87bd3da
parent 32e9b636
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -52,7 +52,30 @@ namespace utility {
template <bool atLeastOneRequired = true>
::testing::AssertionResult validateXmlMultipleLocations(
        const char* xmlFileNameExpr, const char* xmlFileLocationsExpr, const char* xsdFilePathExpr,
    const char* xmlFileName, std::vector<const char*> xmlFileLocations, const char* xsdFilePath);
        const char* xmlFileName, const std::vector<std::string>& xmlFileLocations,
        const char* xsdFilePath);
template <bool atLeastOneRequired = true>
::testing::AssertionResult validateXmlMultipleLocations(
        const char* xmlFileNameExpr, const char* xmlFileLocationsExpr, const char* xsdFilePathExpr,
        const char* xmlFileName, std::initializer_list<const char*> xmlFileLocations,
        const char* xsdFilePath) {
    return validateXmlMultipleLocations<atLeastOneRequired>(
            xmlFileNameExpr, xmlFileLocationsExpr, xsdFilePathExpr, xmlFileName,
            std::vector<std::string>(xmlFileLocations.begin(), xmlFileLocations.end()),
            xsdFilePath);
}
template <bool atLeastOneRequired = true>
::testing::AssertionResult validateXmlMultipleLocations(const char* xmlFileNameExpr,
                                                        const char* xmlFileLocationsExpr,
                                                        const char* xsdFilePathExpr,
                                                        const char* xmlFileName,
                                                        std::vector<const char*> xmlFileLocations,
                                                        const char* xsdFilePath) {
    return validateXmlMultipleLocations<atLeastOneRequired>(
            xmlFileNameExpr, xmlFileLocationsExpr, xsdFilePathExpr, xmlFileName,
            std::vector<std::string>(xmlFileLocations.begin(), xmlFileLocations.end()),
            xsdFilePath);
}

/** ASSERT that all found XML are valid according to an xsd. */
#define ASSERT_VALID_XML_MULTIPLE_LOCATIONS(xmlFileName, xmlFileLocations, xsdFilePath)         \
+10 −11
Original line number Diff line number Diff line
@@ -132,13 +132,14 @@ struct Libxml2Global {
template <bool atLeastOneRequired>
::testing::AssertionResult validateXmlMultipleLocations(
        const char* xmlFileNameExpr, const char* xmlFileLocationsExpr, const char* xsdFilePathExpr,
    const char* xmlFileName, std::vector<const char*> xmlFileLocations, const char* xsdFilePath) {
        const char* xmlFileName, const std::vector<std::string>& xmlFileLocations,
        const char* xsdFilePath) {
    using namespace std::string_literals;

    std::vector<std::string> errors;
    std::vector<std::string> foundFiles;

    for (const char* location : xmlFileLocations) {
    for (const auto& location : xmlFileLocations) {
        std::string xmlFilePath = location + "/"s + xmlFileName;
        if (access(xmlFilePath.c_str(), F_OK) != 0) {
            // If the file does not exist ignore this location and fallback on the next one
@@ -166,13 +167,11 @@ template <bool atLeastOneRequired>
                                  : "\nWhere no file might exist.");
}

template ::testing::AssertionResult validateXmlMultipleLocations<true>(const char*, const char*,
                                                                       const char*, const char*,
                                                                       std::vector<const char*>,
template ::testing::AssertionResult validateXmlMultipleLocations<true>(
        const char*, const char*, const char*, const char*, const std::vector<std::string>&,
        const char*);
template ::testing::AssertionResult validateXmlMultipleLocations<false>(const char*, const char*,
                                                                        const char*, const char*,
                                                                        std::vector<const char*>,
template ::testing::AssertionResult validateXmlMultipleLocations<false>(
        const char*, const char*, const char*, const char*, const std::vector<std::string>&,
        const char*);

}  // namespace utility
+6 −5
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <hwbinder/IPCThreadState.h>

#include <android-base/logging.h>
#include <system/audio_config.h>

#include PATH(android/hardware/audio/FILE_VERSION/IDevice.h)
#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
@@ -135,7 +136,6 @@ class HidlTest : public ::testing::Test {
////////////////////////// Audio policy configuration ////////////////////////
//////////////////////////////////////////////////////////////////////////////

static const std::vector<const char*> kConfigLocations = {"/odm/etc", "/vendor/etc", "/system/etc"};
static constexpr char kConfigFileName[] = "audio_policy_configuration.xml";

// Stringify the argument.
@@ -154,8 +154,8 @@ class PolicyConfig : private PolicyConfigData, public AudioPolicyConfig {
    PolicyConfig()
        : AudioPolicyConfig(hwModules, availableOutputDevices, availableInputDevices,
                            defaultOutputDevice) {
        for (const char* location : kConfigLocations) {
            std::string path = std::string(location) + '/' + kConfigFileName;
        for (const auto& location : android::audio_get_configuration_paths()) {
            std::string path = location + '/' + kConfigFileName;
            if (access(path.c_str(), F_OK) == 0) {
                mFilePath = path;
                break;
@@ -188,7 +188,7 @@ class PolicyConfig : private PolicyConfigData, public AudioPolicyConfig {
    std::string getError() const {
        if (mFilePath.empty()) {
            return std::string{"Could not find "} + kConfigFileName +
                   " file in: " + testing::PrintToString(kConfigLocations);
                   " file in: " + testing::PrintToString(android::audio_get_configuration_paths());
        } else {
            return "Invalid config file: " + mFilePath;
        }
@@ -304,7 +304,8 @@ TEST(CheckConfig, audioPolicyConfigurationValidation) {
                   "is valid according to the schema");

    const char* xsd = "/data/local/tmp/audio_policy_configuration_" STRINGIFY(CPP_VERSION) ".xsd";
    EXPECT_ONE_VALID_XML_MULTIPLE_LOCATIONS(kConfigFileName, kConfigLocations, xsd);
    EXPECT_ONE_VALID_XML_MULTIPLE_LOCATIONS(kConfigFileName,
                                            android::audio_get_configuration_paths(), xsd);
}

class AudioPolicyConfigTest : public AudioHidlTestWithDeviceParameter {
+5 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <iterator>

#include <media/EffectsConfig.h>
#include <system/audio_config.h>
// clang-format off
#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
// clang-format on
@@ -41,13 +42,14 @@ TEST(CheckConfig, audioEffectsConfigurationValidation) {
        GTEST_SKIP() << "No Effects HAL version " STRINGIFY(CPP_VERSION) " on this device";
    }

    std::vector<const char*> locations(std::begin(DEFAULT_LOCATIONS), std::end(DEFAULT_LOCATIONS));
    const char* xsd = "/data/local/tmp/audio_effects_conf_" STRINGIFY(CPP_VERSION) ".xsd";
#if MAJOR_VERSION == 2
    // In V2, audio effect XML is not required. .conf is still allowed though deprecated
    EXPECT_VALID_XML_MULTIPLE_LOCATIONS(DEFAULT_NAME, locations, xsd);
    EXPECT_VALID_XML_MULTIPLE_LOCATIONS(DEFAULT_NAME, android::audio_get_configuration_paths(),
                                        xsd);
#elif MAJOR_VERSION >= 4
    // Starting with V4, audio effect XML is required
    EXPECT_ONE_VALID_XML_MULTIPLE_LOCATIONS(DEFAULT_NAME, locations, xsd);
    EXPECT_ONE_VALID_XML_MULTIPLE_LOCATIONS(DEFAULT_NAME, android::audio_get_configuration_paths(),
                                            xsd);
#endif
}
+8 −4
Original line number Diff line number Diff line
@@ -23,7 +23,8 @@
#include <string>
#include "utility/ValidateXml.h"

static const std::vector<const char*> locations = {"/odm/etc", "/vendor/etc", "/system/etc"};
#include <system/audio_config.h>

static const std::string config = "audio_policy_engine_configuration.xml";
static const std::string schema =
        std::string(XSD_DIR) + "/audio_policy_engine_configuration_V1_0.xsd";
@@ -42,7 +43,8 @@ TEST(ValidateConfiguration, audioPolicyEngineConfiguration) {
    RecordProperty("description",
                   "Verify that the audio policy engine configuration file "
                   "is valid according to the schemas");
    EXPECT_VALID_XML_MULTIPLE_LOCATIONS(config.c_str(), locations, schema.c_str());
    EXPECT_VALID_XML_MULTIPLE_LOCATIONS(config.c_str(), android::audio_get_configuration_paths(),
                                        schema.c_str());
}

/**
@@ -52,9 +54,11 @@ TEST(ValidateConfiguration, audioPolicyEngineConfiguration) {
 */
static bool deviceUsesConfigurableEngine() {
    return android::hardware::audio::common::test::utility::validateXmlMultipleLocations<true>(
                   "", "", "", config.c_str(), locations, schema.c_str()) &&
                   "", "", "", config.c_str(), android::audio_get_configuration_paths(),
                   schema.c_str()) &&
           android::hardware::audio::common::test::utility::validateXmlMultipleLocations<true>(
                   "", "", "", configurableConfig.c_str(), locations, configurableSchemas.c_str());
                   "", "", "", configurableConfig.c_str(), android::audio_get_configuration_paths(),
                   configurableSchemas.c_str());
}

TEST(ValidateConfiguration, audioPolicyEngineConfigurable) {