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
This commit is contained in:
Frankie Lizcano
2022-07-13 20:54:34 +00:00
parent ecba02ae0e
commit f4e0796ef3
4 changed files with 123 additions and 21 deletions

View File

@@ -1073,25 +1073,34 @@ TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
if (!descrambling.support) {
return;
}
int32_t demuxId;
std::shared_ptr<IDemux> demux;
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
if (descrambling.hasFrontendConnection) {
int32_t feId;
mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
ASSERT_TRUE(feId != INVALID_ID);
ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
ASSERT_TRUE(mFrontendTests.setFrontendCallback());
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
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));
ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
ASSERT_TRUE(mDescramblerTests.closeDescrambler());
ASSERT_TRUE(mDemuxTests.closeDemux());
if (descrambling.hasFrontendConnection) {
int32_t feId;
mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
ASSERT_TRUE(feId != INVALID_ID);
ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
ASSERT_TRUE(mFrontendTests.setFrontendCallback());
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
}
if (descrambling.hasFrontendConnection) {
ASSERT_TRUE(mFrontendTests.closeFrontend());
ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
ASSERT_TRUE(mDescramblerTests.closeDescrambler());
ASSERT_TRUE(mDemuxTests.closeDemux());
if (descrambling.hasFrontendConnection) {
ASSERT_TRUE(mFrontendTests.closeFrontend());
}
}
}
@@ -1100,11 +1109,20 @@ TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
if (!descrambling.support) {
return;
}
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]);
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,

View File

@@ -69,6 +69,7 @@ void clearIds() {
diseqcMsgs.clear();
frontendIds.clear();
recordDvrIds.clear();
descramblerIds.clear();
audioFilterIds.clear();
videoFilterIds.clear();
playbackDvrIds.clear();

View File

@@ -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

View File

@@ -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()) {