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

Commit 25409e5b authored by Weilin Xu's avatar Weilin Xu
Browse files

Refactor utils and VTS for HD radio HAL support

Refactored AIDL broadcast radio HAL utils library to both support
version 2 HAL and guarantee backward compatibility for version 1 HAL
implementation using version 1 utils lib. Updated VTS to support HAL
of both AIDL versions.

Bug: 280300929
Test: atest VtsHalBroadcastradioAidlTargetTest
Change-Id: I31e631c794f51c8df230b984837dfb4299864e5c
parent 95f187b5
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -35,8 +35,8 @@ cc_test {
        "libxml2",
    ],
    static_libs: [
        "android.hardware.broadcastradio-V1-ndk",
        "android.hardware.broadcastradio@common-utils-aidl-lib",
        "android.hardware.broadcastradio-V2-ndk",
        "android.hardware.broadcastradio@common-utils-aidl-lib-V2",
        "android.hardware.broadcastradio@vts-utils-lib",
        "libgmock",
    ],
+59 −20
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <broadcastradio-utils-aidl/Utils.h>
#include <broadcastradio-utils-aidl/UtilsV2.h>
#include <cutils/bitops.h>
#include <gmock/gmock.h>

@@ -50,7 +51,6 @@ using ::aidl::android::hardware::broadcastradio::utils::makeSelectorDab;
using ::aidl::android::hardware::broadcastradio::utils::resultToInt;
using ::ndk::ScopedAStatus;
using ::ndk::SharedRefBase;
using ::std::string;
using ::std::vector;
using ::testing::_;
using ::testing::AnyNumber;
@@ -73,20 +73,29 @@ const ConfigFlag kConfigFlagValues[] = {
        ConfigFlag::DAB_FM_SOFT_LINKING,
};

void printSkipped(const string& msg) {
constexpr int32_t kAidlVersion1 = 1;
constexpr int32_t kAidlVersion2 = 2;

void printSkipped(const std::string& msg) {
    const auto testInfo = testing::UnitTest::GetInstance()->current_test_info();
    LOG(INFO) << "[  SKIPPED ] " << testInfo->test_case_name() << "." << testInfo->name()
              << " with message: " << msg;
}

bool isValidAmFmFreq(int64_t freq) {
bool isValidAmFmFreq(int64_t freq, int aidlVersion) {
    ProgramIdentifier id = bcutils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, freq);
    if (aidlVersion == kAidlVersion1) {
        return bcutils::isValid(id);
    } else if (aidlVersion == kAidlVersion2) {
        return bcutils::isValidV2(id);
    }
    LOG(ERROR) << "Unknown AIDL version " << aidlVersion;
    return false;
}

void validateRange(const AmFmBandRange& range) {
    EXPECT_TRUE(isValidAmFmFreq(range.lowerBound));
    EXPECT_TRUE(isValidAmFmFreq(range.upperBound));
void validateRange(const AmFmBandRange& range, int aidlVersion) {
    EXPECT_TRUE(isValidAmFmFreq(range.lowerBound, aidlVersion));
    EXPECT_TRUE(isValidAmFmFreq(range.upperBound, aidlVersion));
    EXPECT_LT(range.lowerBound, range.upperBound);
    EXPECT_GT(range.spacing, 0u);
    EXPECT_EQ((range.upperBound - range.lowerBound) % range.spacing, 0u);
@@ -142,7 +151,7 @@ class CallbackFlag final {

class TunerCallbackImpl final : public BnTunerCallback {
  public:
    TunerCallbackImpl();
    explicit TunerCallbackImpl(int32_t aidlVersion);
    ScopedAStatus onTuneFailed(Result result, const ProgramSelector& selector) override;
    ScopedAStatus onCurrentProgramInfoChanged(const ProgramInfo& info) override;
    ScopedAStatus onProgramListUpdated(const ProgramListChunk& chunk) override;
@@ -160,6 +169,7 @@ class TunerCallbackImpl final : public BnTunerCallback {

  private:
    std::mutex mLock;
    int32_t mCallbackAidlVersion;
    bool mAntennaConnectionState GUARDED_BY(mLock);
    ProgramInfo mCurrentProgramInfo GUARDED_BY(mLock);
    bcutils::ProgramInfoSet mProgramList GUARDED_BY(mLock);
@@ -171,7 +181,7 @@ struct AnnouncementListenerMock : public BnAnnouncementListener {
    MOCK_METHOD1(onListUpdated, ScopedAStatus(const vector<Announcement>&));
};

class BroadcastRadioHalTest : public testing::TestWithParam<string> {
class BroadcastRadioHalTest : public testing::TestWithParam<std::string> {
  protected:
    void SetUp() override;
    void TearDown() override;
@@ -183,14 +193,17 @@ class BroadcastRadioHalTest : public testing::TestWithParam<string> {
    std::shared_ptr<IBroadcastRadio> mModule;
    Properties mProperties;
    std::shared_ptr<TunerCallbackImpl> mCallback;
    int32_t mAidlVersion;
};

MATCHER_P(InfoHasId, id, string(negation ? "does not contain" : "contains") + " " + id.toString()) {
MATCHER_P(InfoHasId, id,
          std::string(negation ? "does not contain" : "contains") + " " + id.toString()) {
    vector<int> ids = bcutils::getAllIds(arg.selector, id.type);
    return ids.end() != find(ids.begin(), ids.end(), id.value);
}

TunerCallbackImpl::TunerCallbackImpl() {
TunerCallbackImpl::TunerCallbackImpl(int32_t aidlVersion) {
    mCallbackAidlVersion = aidlVersion;
    mAntennaConnectionState = true;
}

@@ -230,7 +243,12 @@ ScopedAStatus TunerCallbackImpl::onCurrentProgramInfoChanged(const ProgramInfo&
                physically > IdentifierType::SXM_CHANNEL);

    if (logically == IdentifierType::AMFM_FREQUENCY_KHZ) {
        std::optional<string> ps = bcutils::getMetadataString(info, Metadata::rdsPs);
        std::optional<std::string> ps;
        if (mCallbackAidlVersion == kAidlVersion1) {
            ps = bcutils::getMetadataString(info, Metadata::rdsPs);
        } else {
            ps = bcutils::getMetadataStringV2(info, Metadata::rdsPs);
        }
        if (ps.has_value()) {
            EXPECT_NE(::android::base::Trim(*ps), "")
                    << "Don't use empty RDS_PS as an indicator of missing RSD PS data.";
@@ -323,9 +341,13 @@ void BroadcastRadioHalTest::SetUp() {
    EXPECT_FALSE(mProperties.product.empty());
    EXPECT_GT(mProperties.supportedIdentifierTypes.size(), 0u);

    mCallback = SharedRefBase::make<TunerCallbackImpl>();
    // get AIDL HAL version
    ASSERT_TRUE(mModule->getInterfaceVersion(&mAidlVersion).isOk());
    EXPECT_GE(mAidlVersion, kAidlVersion1);
    EXPECT_LE(mAidlVersion, kAidlVersion2);

    // set callback
    mCallback = SharedRefBase::make<TunerCallbackImpl>(mAidlVersion);
    EXPECT_TRUE(mModule->setTunerCallback(mCallback).isOk());
}

@@ -443,7 +465,7 @@ TEST_P(BroadcastRadioHalTest, GetAmFmRegionConfigRanges) {

    EXPECT_GT(config.ranges.size(), 0u);
    for (const auto& range : config.ranges) {
        validateRange(range);
        validateRange(range, mAidlVersion);
        EXPECT_EQ(range.seekSpacing % range.spacing, 0u);
        EXPECT_GE(range.seekSpacing, range.spacing);
    }
@@ -494,7 +516,7 @@ TEST_P(BroadcastRadioHalTest, GetAmFmRegionConfigCapabilitiesRanges) {
    EXPECT_GT(config.ranges.size(), 0u);

    for (const auto& range : config.ranges) {
        validateRange(range);
        validateRange(range, mAidlVersion);
        EXPECT_EQ(range.seekSpacing, 0u);
    }
}
@@ -522,11 +544,17 @@ TEST_P(BroadcastRadioHalTest, GetDabRegionConfig) {
    std::regex re("^[A-Z0-9][A-Z0-9 ]{0,5}[A-Z0-9]$");

    for (const auto& entry : config) {
        EXPECT_TRUE(std::regex_match(string(entry.label), re));
        EXPECT_TRUE(std::regex_match(std::string(entry.label), re));

        ProgramIdentifier id =
                bcutils::makeIdentifier(IdentifierType::DAB_FREQUENCY_KHZ, entry.frequencyKhz);
        if (mAidlVersion == kAidlVersion1) {
            EXPECT_TRUE(bcutils::isValid(id));
        } else if (mAidlVersion == kAidlVersion2) {
            EXPECT_TRUE(bcutils::isValidV2(id));
        } else {
            LOG(ERROR) << "Unknown callback AIDL version " << mAidlVersion;
        }
    }
}

@@ -1175,10 +1203,21 @@ TEST_P(BroadcastRadioHalTest, HdRadioStationNameId) {
            continue;
        }

        std::optional<string> name = bcutils::getMetadataString(program, Metadata::programName);
        std::optional<std::string> name;
        if (mAidlVersion == kAidlVersion1) {
            name = bcutils::getMetadataString(program, Metadata::programName);
            if (!name) {
                name = bcutils::getMetadataString(program, Metadata::rdsPs);
            }
        } else if (mAidlVersion == kAidlVersion2) {
            name = bcutils::getMetadataStringV2(program, Metadata::programName);
            if (!name) {
                name = bcutils::getMetadataStringV2(program, Metadata::rdsPs);
            }
        } else {
            LOG(ERROR) << "Unknown HAL AIDL version " << mAidlVersion;
        }

        ASSERT_TRUE(name.has_value());

        ProgramIdentifier expectedId = bcutils::makeHdRadioStationName(*name);
+24 −2
Original line number Diff line number Diff line
@@ -25,6 +25,29 @@ package {

cc_library_static {
    name: "android.hardware.broadcastradio@common-utils-aidl-lib",
    defaults: [
        "VtsBroadcastRadioDefaults",
    ],
    shared_libs: [
        "android.hardware.broadcastradio-V1-ndk",
    ],
}

cc_library_static {
    name: "android.hardware.broadcastradio@common-utils-aidl-lib-V2",
    defaults: [
        "VtsBroadcastRadioDefaults",
    ],
    srcs: [
        "src/UtilsV2.cpp",
    ],
    shared_libs: [
        "android.hardware.broadcastradio-V2-ndk",
    ],
}

cc_defaults {
    name: "VtsBroadcastRadioDefaults",
    vendor_available: true,
    relative_install_path: "hw",
    cflags: [
@@ -37,11 +60,10 @@ cc_library_static {
        "-std=c++1z",
    ],
    srcs: [
        "Utils.cpp",
        "src/Utils.cpp",
    ],
    export_include_dirs: ["include"],
    shared_libs: [
        "android.hardware.broadcastradio-V1-ndk",
        "libbase",
    ],
    static_libs: [
+0 −1
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
#pragma once

#include <aidl/android/hardware/broadcastradio/IdentifierType.h>
#include <aidl/android/hardware/broadcastradio/Metadata.h>
#include <aidl/android/hardware/broadcastradio/ProgramFilter.h>
#include <aidl/android/hardware/broadcastradio/ProgramIdentifier.h>
#include <aidl/android/hardware/broadcastradio/ProgramInfo.h>
+35 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.
 */

#pragma once

#include <aidl/android/hardware/broadcastradio/IdentifierType.h>
#include <aidl/android/hardware/broadcastradio/Metadata.h>
#include <aidl/android/hardware/broadcastradio/ProgramIdentifier.h>
#include <aidl/android/hardware/broadcastradio/ProgramInfo.h>
#include <aidl/android/hardware/broadcastradio/ProgramSelector.h>

namespace aidl::android::hardware::broadcastradio {

namespace utils {

bool isValidV2(const ProgramIdentifier& id);
bool isValidV2(const ProgramSelector& sel);
std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag);

}  // namespace utils

}  // namespace aidl::android::hardware::broadcastradio
Loading