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

Commit f4e0796e authored by Frankie Lizcano's avatar Frankie Lizcano
Browse files

Improve Tuner VTS: Generate Descrambling Combos

This CL allows the VTS to read a vendor's configuration file, determine
if the given devices could support the Descrambling dataflow, and generate
all combinations of units to run them on corresponding integration tests.
Each combination is error checked to ensure they meet the minumum
requirements, and any invalid ones are discared, which may narrow the
combination space immensely.

Bug: b/182519645

Test: vts-tradefed run vts --module VtsHalTvTunerTargetTest. Manual
tests with different input configuration files.

Change-Id: Ic1b9dae6b43f8f01bc4e490ef9e910a933562bd2
parent ecba02ae
Loading
Loading
Loading
Loading
+39 −21
Original line number Diff line number Diff line
@@ -1073,6 +1073,14 @@ TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
    if (!descrambling.support) {
        return;
    }
    vector<DescramblingHardwareConnections> descrambling_configs =
            generateDescramblingConfigurations();
    if (descrambling_configs.empty()) {
        ALOGD("No valid descrambling combinations in the configuration file.");
        return;
    }
    for (auto& combination : descrambling_configs) {
        descrambling = combination;
        int32_t demuxId;
        std::shared_ptr<IDemux> demux;
        ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
@@ -1094,18 +1102,28 @@ TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
            ASSERT_TRUE(mFrontendTests.closeFrontend());
        }
    }
}

TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
    description("Test ts audio filter in scrambled broadcast use case");
    if (!descrambling.support) {
        return;
    }
    vector<DescramblingHardwareConnections> descrambling_configs =
            generateDescramblingConfigurations();
    if (descrambling_configs.empty()) {
        ALOGD("No valid descrambling combinations in the configuration file.");
        return;
    }
    for (auto& combination : descrambling_configs) {
        descrambling = combination;
        set<FilterConfig> filterConfs;
        filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
        filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
        scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
                               descramblerMap[descrambling.descramblerId]);
    }
}

INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
                         testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ void clearIds() {
    diseqcMsgs.clear();
    frontendIds.clear();
    recordDvrIds.clear();
    descramblerIds.clear();
    audioFilterIds.clear();
    videoFilterIds.clear();
    playbackDvrIds.clear();
+81 −0
Original line number Diff line number Diff line
@@ -297,6 +297,87 @@ static inline vector<LnbRecordHardwareConnections> generateLnbRecordConfiguratio
    return lnbRecord_configs;
}

/*
 * index 0 - decramblers
 * index 1 - frontends
 * index 2 - audio filters
 * index 3 - video filters
 * index 4 - Dvr SW Fe Connections
 * index 5 - DVR Source Connections
 */
static inline vector<DescramblingHardwareConnections> generateDescramblingCombinations() {
    vector<DescramblingHardwareConnections> combinations;
    vector<string> mfrontendIds = frontendIds;
    vector<string> mDvrFeConnectionIds = playbackDvrIds;
    vector<string> mDvrSourceConnectionIds = playbackDvrIds;

    // Add the empty hardware id to each vector to include combinations where these 3 fields might
    // be optional
    mfrontendIds.push_back(emptyHardwareId);
    mDvrFeConnectionIds.push_back(emptyHardwareId);
    mDvrSourceConnectionIds.push_back(emptyHardwareId);

    const int descramblerIndex = 0;
    const int frontendIndex = 1;
    const int audioFilterIndex = 2;
    const int videoFilterIndex = 3;
    const int dvrFeIdIndex = 4;
    const int dvrSourceIdIndex = 5;

    vector<vector<string>> deviceIds{descramblerIds, mfrontendIds,        audioFilterIds,
                                     videoFilterIds, mDvrFeConnectionIds, mDvrSourceConnectionIds};
    auto idCombinations = generateIdCombinations(deviceIds);
    for (auto& combo : idCombinations) {
        DescramblingHardwareConnections mDescrambling;
        const string feId = combo[frontendIndex];
        const string dvrSwFeId = combo[dvrFeIdIndex];
        const string dvrSourceId = combo[dvrSourceIdIndex];
        mDescrambling.hasFrontendConnection = feId.compare(emptyHardwareId) == 0 ? false : true;
        if (!mDescrambling.hasFrontendConnection) {
            if (dvrSourceId.compare(emptyHardwareId) == 0) {
                // If combination does not have a frontend or dvr source connection, do not include
                // it
                continue;
            }
        } else {
            if (frontendMap[feId].isSoftwareFe && dvrSwFeId.compare(emptyHardwareId) == 0) {
                // If combination has a software frontend and no dvr->software frontend connection,
                // do not include it
                continue;
            }
        }
        if (dvrSwFeId.compare(dvrSourceId) == 0) {
            // If dvr->software frontend connection is the same as dvr source input to tuner, do not
            // include it.
            continue;
        }
        mDescrambling.frontendId = feId;
        mDescrambling.audioFilterId = combo[audioFilterIndex];
        mDescrambling.videoFilterId = combo[videoFilterIndex];
        mDescrambling.dvrSoftwareFeId = dvrSwFeId;
        mDescrambling.dvrSourceId = dvrSourceId;
        mDescrambling.descramblerId = combo[descramblerIndex];
        combinations.push_back(mDescrambling);
    }

    return combinations;
}

static inline vector<DescramblingHardwareConnections> generateDescramblingConfigurations() {
    vector<DescramblingHardwareConnections> descrambling_configs;
    if (configuredDescrambling) {
        ALOGD("Using Descrambling configuration provided.");
        descrambling_configs = {descrambling};
    } else {
        ALOGD("Descrambling not provided. Generating possible combinations. Consider adding it to "
              "the "
              "configuration file.");
        descrambling_configs = generateDescramblingCombinations();
    }

    return descrambling_configs;
}

/** Config all the frontends that would be used in the tests */
inline void initFrontendConfig() {
    // The test will use the internal default fe when default fe is connected to any data flow
+2 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ static vector<string> sectionFilterIds;
static vector<string> frontendIds;
static vector<string> lnbIds;
static vector<string> diseqcMsgs;
static vector<string> descramblerIds;

#define PROVISION_STR                                      \
    "{                                                   " \
@@ -461,6 +462,7 @@ struct TunerTestingConfigAidlReader1_0 {
            auto descramblers = *hardwareConfig.getFirstDescramblers();
            for (auto descramblerConfig : descramblers.getDescrambler()) {
                string id = descramblerConfig.getId();
                descramblerIds.push_back(id);
                descramblerMap[id].casSystemId =
                        static_cast<int32_t>(descramblerConfig.getCasSystemId());
                if (descramblerConfig.hasProvisionStr()) {