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

Commit 3dfdf37e authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Android (Google) Code Review
Browse files

Merge changes If0d81bb9,I049edd9d,I162ec7f8,I3710c74c,I63511129, ...

* changes:
  Add audio routing tests
  Add unit tests for trackPlayerBase
  Add serialization tests for libaudioclient
  Add audioeffect unit tests
  Add audiotrack unit tests
  Add audiorecord unit tests
  Enable clang format hook for media/libaudioclient/tests
parents 173ed31c 8729d684
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -11,3 +11,4 @@ clang_format = true
clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc,cpp
               media/libmediatranscoding/
               services/mediatranscoding/
               media/libaudioclient/tests/
+103 −0
Original line number Diff line number Diff line
@@ -93,3 +93,106 @@ cc_test {
    ],
    data: ["record_test_input_*.txt"],
}

cc_defaults {
    name: "libaudioclient_gtests_defaults",
    cflags: [
        "-Wall",
        "-Werror",
    ],
    shared_libs: [
        "capture_state_listener-aidl-cpp",
        "framework-permission-aidl-cpp",
        "libbase",
        "libbinder",
        "libcgrouprc",
        "libcutils",
        "libdl",
        "liblog",
        "libmedia",
        "libmediametrics",
        "libmediautils",
        "libmedia_helper",
        "libnblog",
        "libprocessgroup",
        "libshmemcompat",
        "libstagefright_foundation",
        "libutils",
        "libvibrator",
        "mediametricsservice-aidl-cpp",
        "packagemanager_aidl-cpp",
        "shared-file-region-aidl-cpp",
    ],
    static_libs: [
        "android.hardware.audio.common@7.0-enums",
        "android.media.audio.common.types-V1-cpp",
        "audioclient-types-aidl-cpp",
        "audioflinger-aidl-cpp",
        "audiopolicy-aidl-cpp",
        "audiopolicy-types-aidl-cpp",
        "av-types-aidl-cpp",
        "effect-aidl-cpp",
        "libaudioclient",
        "libaudioclient_aidl_conversion",
        "libaudiofoundation",
        "libaudiomanager",
        "libaudiopolicy",
        "libaudioutils",
    ],
    data: ["bbb*.raw"],
    test_config_template: "audio_test_template.xml",
}

cc_test {
    name: "audiorecord_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: [
        "audiorecord_tests.cpp",
        "audio_test_utils.cpp",
    ],
}

cc_test {
    name: "audiotrack_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: [
        "audiotrack_tests.cpp",
        "audio_test_utils.cpp",
    ],
}

cc_test {
    name: "audioeffect_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: [
        "audioeffect_tests.cpp",
        "audio_test_utils.cpp",
    ],
}

cc_test {
    name: "audiorouting_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: [
        "audiorouting_tests.cpp",
        "audio_test_utils.cpp",
    ],
    shared_libs: [
        "libxml2",
    ],
}

cc_test {
    name: "audioclient_serialization_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: [
        "audioclient_serialization_tests.cpp",
        "audio_test_utils.cpp",
    ],
}

cc_test {
    name: "trackplayerbase_tests",
    defaults: ["libaudioclient_gtests_defaults"],
    srcs: ["trackplayerbase_tests.cpp"],
}
+54 −57
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@

#include <gtest/gtest.h>

#include <media/AudioCommonTypes.h>
#include <media/AidlConversion.h>
#include <media/AudioCommonTypes.h>

using namespace android;
using namespace android::aidl_utils;
@@ -31,7 +31,8 @@ using media::audio::common::PcmType;

namespace {

template<typename T> size_t hash(const T& t) {
template <typename T>
size_t hash(const T& t) {
    return std::hash<T>{}(t);
}

@@ -52,10 +53,8 @@ AudioChannelLayout make_ACL_LayoutArbitrary() {
    return AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>(
            // Use channels that exist both for input and output,
            // but doesn't form a known layout mask.
            AudioChannelLayout::CHANNEL_FRONT_LEFT |
            AudioChannelLayout::CHANNEL_FRONT_RIGHT |
            AudioChannelLayout::CHANNEL_TOP_SIDE_LEFT |
            AudioChannelLayout::CHANNEL_TOP_SIDE_RIGHT);
            AudioChannelLayout::CHANNEL_FRONT_LEFT | AudioChannelLayout::CHANNEL_FRONT_RIGHT |
            AudioChannelLayout::CHANNEL_TOP_SIDE_LEFT | AudioChannelLayout::CHANNEL_TOP_SIDE_RIGHT);
}

AudioChannelLayout make_ACL_ChannelIndex2() {
@@ -121,8 +120,7 @@ AudioFormatDescription make_AudioFormatDescription(const std::string& encoding)
    return result;
}

AudioFormatDescription make_AudioFormatDescription(PcmType transport,
        const std::string& encoding) {
AudioFormatDescription make_AudioFormatDescription(PcmType transport, const std::string& encoding) {
    auto result = make_AudioFormatDescription(encoding);
    result.pcm = transport;
    return result;
@@ -163,7 +161,8 @@ AudioFormatDescription make_AFD_Encap_with_Enc() {
// is identical to the same format description constructed by the framework.
class HashIdentityTest : public ::testing::Test {
  public:
    template<typename T> void verifyHashIdentity(const std::vector<std::function<T()>>& valueGens) {
    template <typename T>
    void verifyHashIdentity(const std::vector<std::function<T()>>& valueGens) {
        for (size_t i = 0; i < valueGens.size(); ++i) {
            for (size_t j = 0; j < valueGens.size(); ++j) {
                if (i == j) {
@@ -177,27 +176,25 @@ class HashIdentityTest : public ::testing::Test {
};

TEST_F(HashIdentityTest, AudioChannelLayoutHashIdentity) {
    verifyHashIdentity<AudioChannelLayout>({
            make_ACL_None, make_ACL_Invalid, make_ACL_Stereo,
    verifyHashIdentity<AudioChannelLayout>({make_ACL_None, make_ACL_Invalid, make_ACL_Stereo,
                                            make_ACL_LayoutArbitrary, make_ACL_ChannelIndex2,
                                            make_ACL_ChannelIndexArbitrary, make_ACL_VoiceCall});
}

TEST_F(HashIdentityTest, AudioDeviceDescriptionHashIdentity) {
    verifyHashIdentity<AudioDeviceDescription>({
            make_ADD_None, make_ADD_DefaultIn, make_ADD_DefaultOut, make_ADD_WiredHeadset,
    verifyHashIdentity<AudioDeviceDescription>({make_ADD_None, make_ADD_DefaultIn,
                                                make_ADD_DefaultOut, make_ADD_WiredHeadset,
                                                make_ADD_BtScoHeadset});
}

TEST_F(HashIdentityTest, AudioFormatDescriptionHashIdentity) {
    verifyHashIdentity<AudioFormatDescription>({
            make_AFD_Default, make_AFD_Invalid, make_AFD_Pcm16Bit, make_AFD_Bitstream,
    verifyHashIdentity<AudioFormatDescription>({make_AFD_Default, make_AFD_Invalid,
                                                make_AFD_Pcm16Bit, make_AFD_Bitstream,
                                                make_AFD_Encap, make_AFD_Encap_with_Enc});
}

using ChannelLayoutParam = std::tuple<AudioChannelLayout, bool /*isInput*/>;
class AudioChannelLayoutRoundTripTest :
        public testing::TestWithParam<ChannelLayoutParam> {};
class AudioChannelLayoutRoundTripTest : public testing::TestWithParam<ChannelLayoutParam> {};
TEST_P(AudioChannelLayoutRoundTripTest, Aidl2Legacy2Aidl) {
    const auto initial = std::get<0>(GetParam());
    const bool isInput = std::get<1>(GetParam());
@@ -207,21 +204,20 @@ TEST_P(AudioChannelLayoutRoundTripTest, Aidl2Legacy2Aidl) {
    ASSERT_TRUE(convBack.ok());
    EXPECT_EQ(initial, convBack.value());
}
INSTANTIATE_TEST_SUITE_P(AudioChannelLayoutRoundTrip,
        AudioChannelLayoutRoundTripTest,
        testing::Combine(
                testing::Values(AudioChannelLayout{}, make_ACL_Invalid(), make_ACL_Stereo(),
                        make_ACL_LayoutArbitrary(), make_ACL_ChannelIndex2(),
INSTANTIATE_TEST_SUITE_P(AudioChannelLayoutRoundTrip, AudioChannelLayoutRoundTripTest,
                         testing::Combine(testing::Values(AudioChannelLayout{}, make_ACL_Invalid(),
                                                          make_ACL_Stereo(),
                                                          make_ACL_LayoutArbitrary(),
                                                          make_ACL_ChannelIndex2(),
                                                          make_ACL_ChannelIndexArbitrary()),
                                          testing::Values(false, true)));
INSTANTIATE_TEST_SUITE_P(AudioChannelVoiceRoundTrip,
        AudioChannelLayoutRoundTripTest,
INSTANTIATE_TEST_SUITE_P(AudioChannelVoiceRoundTrip, AudioChannelLayoutRoundTripTest,
                         // In legacy constants the voice call is only defined for input.
        testing::Combine(testing::Values(make_ACL_VoiceCall()), testing::Values(true)));
                         testing::Combine(testing::Values(make_ACL_VoiceCall()),
                                          testing::Values(true)));

using ChannelLayoutEdgeCaseParam = std::tuple<int /*legacy*/, bool /*isInput*/, bool /*isValid*/>;
class AudioChannelLayoutEdgeCaseTest :
        public testing::TestWithParam<ChannelLayoutEdgeCaseParam> {};
class AudioChannelLayoutEdgeCaseTest : public testing::TestWithParam<ChannelLayoutEdgeCaseParam> {};
TEST_P(AudioChannelLayoutEdgeCaseTest, Legacy2Aidl) {
    const audio_channel_mask_t legacy = static_cast<audio_channel_mask_t>(std::get<0>(GetParam()));
    const bool isInput = std::get<1>(GetParam());
@@ -229,8 +225,8 @@ TEST_P(AudioChannelLayoutEdgeCaseTest, Legacy2Aidl) {
    auto conv = legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy, isInput);
    EXPECT_EQ(isValid, conv.ok());
}
INSTANTIATE_TEST_SUITE_P(AudioChannelLayoutEdgeCase,
        AudioChannelLayoutEdgeCaseTest,
INSTANTIATE_TEST_SUITE_P(
        AudioChannelLayoutEdgeCase, AudioChannelLayoutEdgeCaseTest,
        testing::Values(
                // Valid legacy input masks.
                std::make_tuple(AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO, true, true),
@@ -240,25 +236,26 @@ INSTANTIATE_TEST_SUITE_P(AudioChannelLayoutEdgeCase,
                std::make_tuple(
                        // This has the same numerical representation as Mask 'A' below
                        AUDIO_CHANNEL_OUT_FRONT_CENTER | AUDIO_CHANNEL_OUT_LOW_FREQUENCY |
                        AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT, false, true),
                                AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT,
                        false, true),
                std::make_tuple(
                        // This has the same numerical representation as Mask 'B' below
                        AUDIO_CHANNEL_OUT_FRONT_CENTER | AUDIO_CHANNEL_OUT_LOW_FREQUENCY |
                        AUDIO_CHANNEL_OUT_TOP_BACK_LEFT, false, true),
                                AUDIO_CHANNEL_OUT_TOP_BACK_LEFT,
                        false, true),
                // Invalid legacy input masks.
                std::make_tuple(AUDIO_CHANNEL_IN_6, true, false),
                std::make_tuple(
                        AUDIO_CHANNEL_IN_6 | AUDIO_CHANNEL_IN_FRONT_PROCESSED, true, false),
                std::make_tuple(
                        AUDIO_CHANNEL_IN_PRESSURE | AUDIO_CHANNEL_IN_X_AXIS |
                        AUDIO_CHANNEL_IN_Y_AXIS | AUDIO_CHANNEL_IN_Z_AXIS, true, false),
                std::make_tuple(AUDIO_CHANNEL_IN_6 | AUDIO_CHANNEL_IN_FRONT_PROCESSED, true, false),
                std::make_tuple(AUDIO_CHANNEL_IN_PRESSURE | AUDIO_CHANNEL_IN_X_AXIS |
                                        AUDIO_CHANNEL_IN_Y_AXIS | AUDIO_CHANNEL_IN_Z_AXIS,
                                true, false),
                std::make_tuple(  // Mask 'A'
                        AUDIO_CHANNEL_IN_STEREO | AUDIO_CHANNEL_IN_VOICE_UPLINK, true, false),
                std::make_tuple(  // Mask 'B'
                        AUDIO_CHANNEL_IN_STEREO | AUDIO_CHANNEL_IN_VOICE_DNLINK, true, false)));

class AudioDeviceDescriptionRoundTripTest :
        public testing::TestWithParam<AudioDeviceDescription> {};
class AudioDeviceDescriptionRoundTripTest : public testing::TestWithParam<AudioDeviceDescription> {
};
TEST_P(AudioDeviceDescriptionRoundTripTest, Aidl2Legacy2Aidl) {
    const auto initial = GetParam();
    auto conv = aidl2legacy_AudioDeviceDescription_audio_devices_t(initial);
@@ -267,13 +264,13 @@ TEST_P(AudioDeviceDescriptionRoundTripTest, Aidl2Legacy2Aidl) {
    ASSERT_TRUE(convBack.ok());
    EXPECT_EQ(initial, convBack.value());
}
INSTANTIATE_TEST_SUITE_P(AudioDeviceDescriptionRoundTrip,
        AudioDeviceDescriptionRoundTripTest,
INSTANTIATE_TEST_SUITE_P(AudioDeviceDescriptionRoundTrip, AudioDeviceDescriptionRoundTripTest,
                         testing::Values(AudioDeviceDescription{}, make_ADD_DefaultIn(),
                make_ADD_DefaultOut(), make_ADD_WiredHeadset(), make_ADD_BtScoHeadset()));
                                         make_ADD_DefaultOut(), make_ADD_WiredHeadset(),
                                         make_ADD_BtScoHeadset()));

class AudioFormatDescriptionRoundTripTest :
        public testing::TestWithParam<AudioFormatDescription> {};
class AudioFormatDescriptionRoundTripTest : public testing::TestWithParam<AudioFormatDescription> {
};
TEST_P(AudioFormatDescriptionRoundTripTest, Aidl2Legacy2Aidl) {
    const auto initial = GetParam();
    auto conv = aidl2legacy_AudioFormatDescription_audio_format_t(initial);
@@ -282,6 +279,6 @@ TEST_P(AudioFormatDescriptionRoundTripTest, Aidl2Legacy2Aidl) {
    ASSERT_TRUE(convBack.ok());
    EXPECT_EQ(initial, convBack.value());
}
INSTANTIATE_TEST_SUITE_P(AudioFormatDescriptionRoundTrip,
        AudioFormatDescriptionRoundTripTest,
        testing::Values(make_AFD_Invalid(), AudioFormatDescription{}, make_AFD_Pcm16Bit()));
INSTANTIATE_TEST_SUITE_P(AudioFormatDescriptionRoundTrip, AudioFormatDescriptionRoundTripTest,
                         testing::Values(make_AFD_Invalid(), AudioFormatDescription{},
                                         make_AFD_Pcm16Bit()));
+21 −54
Original line number Diff line number Diff line
@@ -37,25 +37,10 @@ TEST(audio_aidl_status_tests, statusRoundTripSmallValues) {

// Special status values are preserved on round trip.
TEST(audio_aidl_status_tests, statusRoundTripSpecialValues) {
    for (status_t status : {
            OK,
            UNKNOWN_ERROR,
            NO_MEMORY,
            INVALID_OPERATION,
            BAD_VALUE,
            BAD_TYPE,
            NAME_NOT_FOUND,
            PERMISSION_DENIED,
            NO_INIT,
            ALREADY_EXISTS,
            DEAD_OBJECT,
            FAILED_TRANSACTION,
            BAD_INDEX,
            NOT_ENOUGH_DATA,
            WOULD_BLOCK,
            TIMED_OUT,
            UNKNOWN_TRANSACTION,
            FDS_NOT_ALLOWED}) {
    for (status_t status :
         {OK, UNKNOWN_ERROR, NO_MEMORY, INVALID_OPERATION, BAD_VALUE, BAD_TYPE, NAME_NOT_FOUND,
          PERMISSION_DENIED, NO_INIT, ALREADY_EXISTS, DEAD_OBJECT, FAILED_TRANSACTION, BAD_INDEX,
          NOT_ENOUGH_DATA, WOULD_BLOCK, TIMED_OUT, UNKNOWN_TRANSACTION, FDS_NOT_ALLOWED}) {
        ASSERT_EQ(status, statusTFromBinderStatus(binderStatusFromStatusT(status)));
    }
}
@@ -64,12 +49,8 @@ TEST(audio_aidl_status_tests, statusRoundTripSpecialValues) {
TEST(audio_aidl_status_tests, binderStatusExceptions) {
    for (int exceptionCode : {
                 // Status::EX_NONE,
            Status::EX_SECURITY,
            Status::EX_BAD_PARCELABLE,
            Status::EX_ILLEGAL_ARGUMENT,
            Status::EX_NULL_POINTER,
            Status::EX_ILLEGAL_STATE,
            Status::EX_NETWORK_MAIN_THREAD,
                 Status::EX_SECURITY, Status::EX_BAD_PARCELABLE, Status::EX_ILLEGAL_ARGUMENT,
                 Status::EX_NULL_POINTER, Status::EX_ILLEGAL_STATE, Status::EX_NETWORK_MAIN_THREAD,
                 Status::EX_UNSUPPORTED_OPERATION,
                 // Status::EX_SERVICE_SPECIFIC, -- tested fromServiceSpecificError()
                 Status::EX_PARCELABLE,
@@ -85,25 +66,11 @@ TEST(audio_aidl_status_tests, binderStatusExceptions) {

// Binder transaction errors show exactly in status_t; these come fromStatusT().
TEST(audio_aidl_status_tests, binderStatusTransactionError) {
    for (status_t status : {
            OK, // Note: fromStatusT does check if this is 0, so this is no error.
            UNKNOWN_ERROR,
            NO_MEMORY,
            INVALID_OPERATION,
            BAD_VALUE,
            BAD_TYPE,
            NAME_NOT_FOUND,
            PERMISSION_DENIED,
            NO_INIT,
            ALREADY_EXISTS,
            DEAD_OBJECT,
            FAILED_TRANSACTION,
            BAD_INDEX,
            NOT_ENOUGH_DATA,
            WOULD_BLOCK,
            TIMED_OUT,
            UNKNOWN_TRANSACTION,
            FDS_NOT_ALLOWED}) {
    for (status_t status :
         {OK,  // Note: fromStatusT does check if this is 0, so this is no error.
          UNKNOWN_ERROR, NO_MEMORY, INVALID_OPERATION, BAD_VALUE, BAD_TYPE, NAME_NOT_FOUND,
          PERMISSION_DENIED, NO_INIT, ALREADY_EXISTS, DEAD_OBJECT, FAILED_TRANSACTION, BAD_INDEX,
          NOT_ENOUGH_DATA, WOULD_BLOCK, TIMED_OUT, UNKNOWN_TRANSACTION, FDS_NOT_ALLOWED}) {
        ASSERT_EQ(status, statusTFromBinderStatus(Status::fromStatusT(status)));
    }
}
+32 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2022 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.
-->
<configuration description="Unit test configuration for {MODULE}">
    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />

    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="cleanup" value="true" />
        <option name="push-file" key="{MODULE}" value="/data/local/tmp/{MODULE}" />

        <!-- Files used for audio testing -->
        <option name="push-file" key="bbb_1ch_8kHz_s16le.raw" value="/data/local/tmp/bbb_1ch_8kHz_s16le.raw" />
        <option name="push-file" key="bbb_2ch_24kHz_s16le.raw" value="/data/local/tmp/bbb_2ch_24kHz_s16le.raw" />
    </target_preparer>

    <test class="com.android.tradefed.testtype.GTest" >
        <option name="native-test-device-path" value="/data/local/tmp" />
        <option name="module-name" value="{MODULE}" />
    </test>
</configuration>
Loading