[PATCH v2 07/15] KVM: selftests: Add various print flags to KVM Selftest Runner
Vipin Sharma
vipinsh at google.com
Fri Jun 6 16:56:11 PDT 2025
Add various print flags to selectively print outputs on terminal based
on test execution status (passed, failed, timed out, skipped, no run).
Provide further options to print only particular execution status, like
print only status of failed tests.
Example: To print status, stdout and stderr for failed tests and only
print status of passed test:
python3 runner --test-dirs tests --print-failed \
--print-passed-status
Signed-off-by: Vipin Sharma <vipinsh at google.com>
---
.../testing/selftests/kvm/runner/__main__.py | 114 ++++++++++++++++++
.../selftests/kvm/runner/test_runner.py | 10 +-
2 files changed, 123 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/kvm/runner/__main__.py b/tools/testing/selftests/kvm/runner/__main__.py
index 3f11a20e76a9..4406d8e4847a 100644
--- a/tools/testing/selftests/kvm/runner/__main__.py
+++ b/tools/testing/selftests/kvm/runner/__main__.py
@@ -64,9 +64,115 @@ def cli():
default=False,
help="Print only test's status and avoid printing stdout and stderr of the tests")
+ parser.add_argument("--print-passed",
+ action="store_true",
+ default=False,
+ help="Print passed test's stdout, stderr and status."
+ )
+
+ parser.add_argument("--print-passed-status",
+ action="store_true",
+ default=False,
+ help="Print only passed test's status."
+ )
+
+ parser.add_argument("--print-failed",
+ action="store_true",
+ default=False,
+ help="Print failed test's stdout, stderr and status."
+ )
+
+ parser.add_argument("--print-failed-status",
+ action="store_true",
+ default=False,
+ help="Print only failed test's status."
+ )
+
+ parser.add_argument("--print-skipped",
+ action="store_true",
+ default=False,
+ help="Print skipped test's stdout, stderr and status."
+ )
+
+ parser.add_argument("--print-skipped-status",
+ action="store_true",
+ default=False,
+ help="Print only skipped test's status."
+ )
+
+ parser.add_argument("--print-timed-out",
+ action="store_true",
+ default=False,
+ help="Print timed out test's stdout, stderr and status."
+ )
+
+ parser.add_argument("--print-timed-out-status",
+ action="store_true",
+ default=False,
+ help="Print only timed out test's status."
+ )
+
+ parser.add_argument("--print-no-runs",
+ action="store_true",
+ default=False,
+ help="Print stdout, stderr and status for tests which didn't run."
+ )
+
+ parser.add_argument("--print-no-runs-status",
+ action="store_true",
+ default=False,
+ help="Print only tests which didn't run."
+ )
+
return parser.parse_args()
+def level_filters(args):
+ # Levels added here will be printed by logger.
+ levels = set()
+
+ if args.print_passed or args.print_passed_status or args.print_status:
+ levels.add(SelftestStatus.PASSED)
+
+ if args.print_failed or args.print_failed_status or args.print_status:
+ levels.add(SelftestStatus.FAILED)
+
+ if args.print_skipped or args.print_skipped_status or args.print_status:
+ levels.add(SelftestStatus.SKIPPED)
+
+ if args.print_timed_out or args.print_timed_out_status or args.print_status:
+ levels.add(SelftestStatus.TIMED_OUT)
+
+ if args.print_no_runs or args.print_no_runs_status or args.print_status:
+ levels.add(SelftestStatus.NO_RUN)
+
+ # Nothing set explicitly, enable all.
+ if not levels:
+ args.print_passed = True
+ levels.add(SelftestStatus.PASSED)
+
+ args.print_failed = True
+ levels.add(SelftestStatus.FAILED)
+
+ args.print_skipped = True
+ levels.add(SelftestStatus.SKIPPED)
+
+ args.print_timed_out = True
+ levels.add(SelftestStatus.TIMED_OUT)
+
+ args.print_no_runs = True
+ levels.add(SelftestStatus.NO_RUN)
+
+ levels.add(logging.NOTSET)
+ levels.add(logging.DEBUG)
+ levels.add(logging.INFO)
+ levels.add(logging.WARN)
+ levels.add(logging.ERROR)
+ levels.add(logging.CRITICAL)
+
+ return levels
+
+
def setup_logging(args):
class TerminalColorFormatter(logging.Formatter):
reset = "\033[0m"
@@ -91,6 +197,13 @@ def setup_logging(args):
return (self.COLORS.get(record.levelno, "") +
super().format(record) + self.reset)
+ class LevelFilter:
+ def __init__(self, levels):
+ self.levels = levels
+
+ def filter(self, record):
+ return record.levelno in self.levels
+
logger = logging.getLogger("runner")
logger.setLevel(logging.INFO)
@@ -102,6 +215,7 @@ def setup_logging(args):
ch = logging.StreamHandler()
ch_formatter = TerminalColorFormatter(**formatter_args)
ch.setFormatter(ch_formatter)
+ ch.addFilter(LevelFilter(level_filters(args)))
logger.addHandler(ch)
if args.output != None:
diff --git a/tools/testing/selftests/kvm/runner/test_runner.py b/tools/testing/selftests/kvm/runner/test_runner.py
index 474408fcab51..8f2372834104 100644
--- a/tools/testing/selftests/kvm/runner/test_runner.py
+++ b/tools/testing/selftests/kvm/runner/test_runner.py
@@ -18,6 +18,13 @@ class TestRunner:
self.output_dir = args.output
self.jobs = args.jobs
self.print_status = args.print_status
+ self.print_stds = {
+ SelftestStatus.PASSED: args.print_passed,
+ SelftestStatus.FAILED: args.print_failed,
+ SelftestStatus.SKIPPED: args.print_skipped,
+ SelftestStatus.TIMED_OUT: args.print_timed_out,
+ SelftestStatus.NO_RUN: args.print_no_runs
+ }
for test_file in test_files:
self.tests.append(Selftest(test_file, args.executable,
@@ -30,7 +37,8 @@ class TestRunner:
def _log_result(self, test_result):
logger.log(test_result.status,
f"[{test_result.status}] {test_result.test_path}")
- if (self.output_dir is None and self.print_status is False):
+ if (self.output_dir is None and self.print_status is False
+ and self.print_stds.get(test_result.status, True)):
logger.info("************** STDOUT BEGIN **************")
logger.info(test_result.stdout)
logger.info("************** STDOUT END **************")
--
2.50.0.rc0.604.gd4ff7b7c86-goog
More information about the linux-arm-kernel
mailing list