Merge "Change artifact matching to be more strict" into main

This commit is contained in:
Luca Farsi
2024-08-12 17:50:33 +00:00
committed by Gerrit Code Review
2 changed files with 26 additions and 31 deletions

View File

@@ -81,6 +81,7 @@ class BuildPlanner:
build_targets = set() build_targets = set()
packaging_functions = set() packaging_functions = set()
self.file_download_options = self._aggregate_file_download_options()
for target in self.args.extra_targets: for target in self.args.extra_targets:
if self._unused_target_exclusion_enabled( if self._unused_target_exclusion_enabled(
target target
@@ -107,49 +108,24 @@ class BuildPlanner:
def _build_target_used(self, target: str) -> bool: def _build_target_used(self, target: str) -> bool:
"""Determines whether this target's outputs are used by the test configurations listed in the build context.""" """Determines whether this target's outputs are used by the test configurations listed in the build context."""
file_download_regexes = self._aggregate_file_download_regexes()
# For all of a targets' outputs, check if any of the regexes used by tests # For all of a targets' outputs, check if any of the regexes used by tests
# to download artifacts would match it. If any of them do then this target # to download artifacts would match it. If any of them do then this target
# is necessary. # is necessary.
for artifact in self._get_target_potential_outputs(target): regex = r'\b(%s)\b' % re.escape(target)
for regex in file_download_regexes: return any(re.search(regex, opt) for opt in self.file_download_options)
if re.match(regex, artifact):
return True
return False
def _get_target_potential_outputs(self, target: str) -> set[str]: def _aggregate_file_download_options(self) -> set[str]:
tests_suffix = '-tests'
if target.endswith('tests'):
tests_suffix = ''
# This is a list of all the potential zips output by the test suite targets.
# If the test downloads artifacts from any of these zips, we will be
# conservative and avoid skipping the tests.
return {
f'{target}.zip',
f'android-{target}.zip',
f'android-{target}-verifier.zip',
f'{target}{tests_suffix}_list.zip',
f'android-{target}{tests_suffix}_list.zip',
f'{target}{tests_suffix}_host-shared-libs.zip',
f'android-{target}{tests_suffix}_host-shared-libs.zip',
f'{target}{tests_suffix}_configs.zip',
f'android-{target}{tests_suffix}_configs.zip',
}
def _aggregate_file_download_regexes(self) -> set[re.Pattern]:
"""Lists out all test config options to specify targets to download. """Lists out all test config options to specify targets to download.
These come in the form of regexes. These come in the form of regexes.
""" """
all_regexes = set() all_options = set()
for test_info in self._get_test_infos(): for test_info in self._get_test_infos():
for opt in test_info.get('extraOptions', []): for opt in test_info.get('extraOptions', []):
# check the known list of options for downloading files. # check the known list of options for downloading files.
if opt.get('key') in self._DOWNLOAD_OPTS: if opt.get('key') in self._DOWNLOAD_OPTS:
all_regexes.update( all_options.update(opt.get('values', []))
re.compile(value) for value in opt.get('values', []) return all_options
)
return all_regexes
def _get_test_infos(self): def _get_test_infos(self):
return self.build_context.get('testContext', dict()).get('testInfos', []) return self.build_context.get('testContext', dict()).get('testInfos', [])

View File

@@ -380,6 +380,25 @@ class BuildPlannerTest(unittest.TestCase):
self.assertSetEqual(build_plan.build_targets, set()) self.assertSetEqual(build_plan.build_targets, set())
def test_target_regex_matching_not_too_broad(self):
build_target = 'test_target'
test_context = self.get_test_context(build_target)
test_context['testInfos'][0]['extraOptions'] = [{
'key': 'additional-files-filter',
'values': [f'.*a{build_target}.*\.zip'],
}]
build_planner = self.create_build_planner(
build_targets={build_target},
build_context=self.create_build_context(
test_context=test_context,
enabled_build_features={'test_target_unused_exclusion'},
),
)
build_plan = build_planner.create_build_plan()
self.assertSetEqual(build_plan.build_targets, set())
def create_build_planner( def create_build_planner(
self, self,
build_targets: set[str], build_targets: set[str],