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

Commit 8b87f25f authored by Frankie Lizcano's avatar Frankie Lizcano
Browse files

Improve Tuner VTS: Generate Live Combos

This CL allows the VTS to read a vendor's configuration file, determine
if the given devices could support the Live 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.

This CL also adds logic to store IP and PCR filter IDs to include
using them in any configuration combinations. We also pair PCR filters
with audio and video filters if the vendor chooses to provide more than
1, enforcing the invariant that the number of pcr, audio, and video
filters must be equal.  If there is only 1 pcr filters, we default to
use that one.

Bug: b/182519645

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

Change-Id: Icb2d96b32ed7a14b845c752a79744c44fdaf04e3
parent 9c464f7c
Loading
Loading
Loading
Loading
+127 −64
Original line number Diff line number Diff line
@@ -557,6 +557,9 @@ TEST_P(TunerDemuxAidlTest, openDemux) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        int32_t feId;
        int32_t demuxId;
        std::shared_ptr<IDemux> demux;
@@ -569,14 +572,18 @@ TEST_P(TunerDemuxAidlTest, openDemux) {
        ASSERT_TRUE(mDemuxTests.closeDemux());
        ASSERT_TRUE(mFrontendTests.closeFrontend());
    }
}

TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
    description("Get the A/V sync time from a PCR filter.");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
        return;
            continue;
        }
        int32_t feId;
        int32_t demuxId;
@@ -596,7 +603,8 @@ TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
        ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
                                                   filterMap[live.videoFilterId].bufferSize));
        ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
    ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
        ASSERT_TRUE(
                mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
        mediaFilter = mFilterTests.getFilterById(mediaFilterId);
        ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
                                                   filterMap[live.pcrFilterId].bufferSize));
@@ -610,6 +618,7 @@ TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
        ASSERT_TRUE(mDemuxTests.closeDemux());
        ASSERT_TRUE(mFrontendTests.closeFrontend());
    }
}

TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
    description("Open and start a filter in Demux.");
@@ -617,8 +626,12 @@ TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
        return;
    }
    // TODO use parameterized tests
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
    description("Open and configure an ip filter in Demux.");
@@ -626,11 +639,15 @@ TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        if (live.ipFilterId.compare(emptyHardwareId) == 0) {
        return;
            continue;
        }
        configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
    description("Recofigure and restart a filter to test start id.");
@@ -638,9 +655,14 @@ TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
        return;
    }
    // TODO use parameterized tests
    reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId],
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId],
                                        filterMap[live.videoFilterId],
                                        frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
    description("Pick up all the possible linkages from the demux caps and set them up.");
@@ -969,8 +991,12 @@ TEST_P(TunerFrontendAidlTest, TuneFrontend) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        mFrontendTests.tuneTest(frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
    description("Run an auto frontend scan with specific setting and check lock scanMessage");
@@ -1001,8 +1027,12 @@ TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        mFrontendTests.tuneTest(frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
    description("Run an blind frontend scan with setting and check lock scanMessage");
@@ -1021,19 +1051,27 @@ TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        if (!frontendMap[live.frontendId].canConnectToCiCam) {
        return;
            continue;
        }
        mFrontendTests.tuneTest(frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
    description("Test Frontend get hardware info");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
    }
}

TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
    description("Test Max Frontend number");
@@ -1048,43 +1086,63 @@ TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
    }
}

TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
    description("Test Video Filter functionality in Broadcast use case.");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
    description("Test Audio Filter functionality in Broadcast use case.");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
    description("Test Section Filter functionality in Broadcast use case.");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
        return;
            continue;
        }
        broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
    description("Test the av filter data bufferring.");
    if (!live.hasFrontendConnection) {
        return;
    }
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
    }
}

TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
    description("Test Video Filter functionality in Broadcast with Lnb use case.");
@@ -1108,7 +1166,12 @@ TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
    if (!live.hasFrontendConnection) {
        return;
    }
    mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
    auto live_configs = generateLiveConfigurations();
    for (auto& configuration : live_configs) {
        live = configuration;
        mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId],
                                         frontendMap[live.frontendId]);
    }
}

TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
+2 −0
Original line number Diff line number Diff line
@@ -68,6 +68,8 @@ void clearIds() {
    lnbIds.clear();
    diseqcMsgs.clear();
    frontendIds.clear();
    ipFilterIds.clear();
    pcrFilterIds.clear();
    recordDvrIds.clear();
    timeFilterIds.clear();
    descramblerIds.clear();
+82 −0
Original line number Diff line number Diff line
@@ -457,6 +457,81 @@ static inline vector<DvrRecordHardwareConnections> generateRecordConfigurations(
    return record_configs;
}

/*
 * index 0 - frontends
 * index 1 - audio filters
 * index 2 - playback dvrs
 * index 3 - section Filters
 */
static inline vector<LiveBroadcastHardwareConnections> generateLiveCombinations() {
    vector<LiveBroadcastHardwareConnections> combinations;
    vector<string> mSectionFilterIds = sectionFilterIds;
    vector<string> mDvrSwConnectionIds = playbackDvrIds;

    // Adding the empty hardware id to cover cases where fields are optional
    mSectionFilterIds.push_back(emptyHardwareId);
    mDvrSwConnectionIds.push_back(emptyHardwareId);

    const int frontendIdIndex = 0;
    const int audioFilterIdIndex = 1;
    const int dvrSwConnectionIdIndex = 2;
    const int sectionFilterIdIndex = 3;

    vector<vector<string>> deviceIds{frontendIds, audioFilterIds, mDvrSwConnectionIds,
                                     mSectionFilterIds};

    auto idCombinations = generateIdCombinations(deviceIds);
    for (auto& combo : idCombinations) {
        LiveBroadcastHardwareConnections mLive;
        const string feId = combo[frontendIdIndex];
        const string dvrSwConnectionId = combo[dvrSwConnectionIdIndex];
        mLive.hasFrontendConnection = true;

        if (frontendMap[feId].isSoftwareFe && dvrSwConnectionId.compare(emptyHardwareId) == 0) {
            // If the frontend is a software frontend and there is no dvr playback connected, do not
            // include configuration
            continue;
        }
        mLive.frontendId = feId;
        mLive.dvrSoftwareFeId = dvrSwConnectionId;
        mLive.audioFilterId = combo[audioFilterIdIndex];
        const int videoFilterIdIndex =
                find(audioFilterIds.begin(), audioFilterIds.end(), mLive.audioFilterId) -
                audioFilterIds.begin();
        mLive.videoFilterId = videoFilterIds[videoFilterIdIndex];
        mLive.sectionFilterId = combo[sectionFilterIdIndex];

        if (pcrFilterIds.empty()) {
            // If pcr Filters have not been provided, set it to empty hardware id
            mLive.pcrFilterId = emptyHardwareId;
        } else {
            // If pcr Filters have been provided, use the first index if there is only 1, or choose
            // the filter that corresponds to the correct audio and video filter pair
            const int pcrFilterIdIndex = pcrFilterIds.size() == 1 ? 0 : videoFilterIdIndex;
            mLive.pcrFilterId = pcrFilterIds[pcrFilterIdIndex];
        }

        combinations.push_back(mLive);
    }

    return combinations;
}

static inline vector<LiveBroadcastHardwareConnections> generateLiveConfigurations() {
    vector<LiveBroadcastHardwareConnections> live_configs;
    if (configuredLive) {
        ALOGD("Using Live configuration provided.");
        live_configs = {live};
    } else {
        ALOGD("Live not provided. Generating possible combinations. Consider adding it to "
              "the "
              "configuration file.");
        live_configs = generateLiveCombinations();
    }

    return live_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
@@ -785,6 +860,13 @@ inline bool validateConnections() {
        return false;
    }

    if (!pcrFilterIds.empty() && pcrFilterIds.size() != 1 &&
        pcrFilterIds.size() != audioFilterIds.size()) {
        ALOGW("[vts config] When more than 1 pcr filter is configured, the number of pcr filters "
              "must equal the number of audio and video filters.");
        return false;
    }

    bool timeFilterIsValid =
            timeFilter.support ? timeFilterMap.find(timeFilter.timeFilterId) != timeFilterMap.end()
                               : true;
+6 −0
Original line number Diff line number Diff line
@@ -79,7 +79,9 @@ const string emptyHardwareId = "";
static string mConfigFilePath;

static vector<string> playbackDvrIds;
static vector<string> ipFilterIds;
static vector<string> recordDvrIds;
static vector<string> pcrFilterIds;
static vector<string> timeFilterIds;
static vector<string> audioFilterIds;
static vector<string> videoFilterIds;
@@ -853,6 +855,10 @@ struct TunerTestingConfigAidlReader1_0 {
            recordFilterIds.push_back(filterConfig.getId());
        } else if (subType == FilterSubTypeEnum::SECTION) {
            sectionFilterIds.push_back(filterConfig.getId());
        } else if (subType == FilterSubTypeEnum::PCR) {
            pcrFilterIds.push_back(filterConfig.getId());
        } else if (subType == FilterSubTypeEnum::IP) {
            ipFilterIds.push_back(filterConfig.getId());
        }

        switch (mainType) {