From a425db20b1a7fee630de15c385f2a1c24f5ab127 Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Tue, 7 May 2024 23:58:22 +0200 Subject: [PATCH] twister: Add test suite filtering on twister.json compose When Twister composes resulting twister.json reports, add optional filtering by a test instance resulting status and/or its individual properties to be allowed/denied on output to the JSON file. This internal feature is introduced to facilitate JSON reports with a custom data schema. Signed-off-by: Dmitrii Golovanov --- scripts/pylib/twister/twisterlib/reports.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scripts/pylib/twister/twisterlib/reports.py b/scripts/pylib/twister/twisterlib/reports.py index 4bc352e4f1d..5521ec868c7 100644 --- a/scripts/pylib/twister/twisterlib/reports.py +++ b/scripts/pylib/twister/twisterlib/reports.py @@ -234,7 +234,7 @@ class Reporting: with open(filename, 'wb') as report: report.write(result) - def json_report(self, filename, version="NA", platform=None): + def json_report(self, filename, version="NA", platform=None, filters=None): logger.info(f"Writing JSON report {filename}") if self.env.options.report_all_options: @@ -261,6 +261,14 @@ class Reporting: continue if instance.status == "filtered" and not self.env.options.report_filtered: continue + if (filters and 'allow_status' in filters and instance.status not in filters['allow_status']): + logger.debug(f"Skip test suite '{instance.testsuite.name}' status '{instance.status}' " + f"not allowed for {filename}") + continue + if (filters and 'deny_status' in filters and instance.status in filters['deny_status']): + logger.debug(f"Skip test suite '{instance.testsuite.name}' status '{instance.status}' " + f"denied for {filename}") + continue suite = {} handler_log = os.path.join(instance.build_dir, "handler.log") pytest_log = os.path.join(instance.build_dir, "twister_harness.log") @@ -366,6 +374,13 @@ class Reporting: if instance.recording is not None: suite['recording'] = instance.recording + # Pass suite properties through the context filters. + if filters and 'allow_suite' in filters: + suite = {k:v for k,v in suite.items() if k in filters['allow_suite']} + + if filters and 'deny_suite' in filters: + suite = {k:v for k,v in suite.items() if k not in filters['deny_suite']} + suites.append(suite) report["testsuites"] = suites