ktest: Add a --dry-run mode

When working on a ktest configuration, it is often useful to inspect the
final option values after includes, defaults, per-test overrides, and
variable expansion have been applied, without actually starting a test run.

Add a --dry-run option that reads the configuration, prints the test
preamble using resolved option values, and exits before opening LOG_FILE or
executing any test logic.

This is useful for debugging ktest configurations and for scripts that need
to validate the final resolved settings without triggering side effects.

Cc: John Hawley <warthog9@eaglescrag.net>
Cc: Andrea Righi <arighi@nvidia.com>
Cc: Marcos Paulo de Souza <mpdesouza@suse.com>
Cc: Matthieu Baerts <matttbe@kernel.org>
Cc: Fernando Fernandez Mancera <fmancera@suse.de>
Cc: Pedro Falcato <pfalcato@suse.de>
Link: https://patch.msgid.link/20260307-ktest-fixes-v1-9-565d412f4925@suse.com
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Ricardo B. Marlière
2026-03-07 19:08:04 -03:00
committed by Steven Rostedt
parent bc6e165a45
commit 2295174498

View File

@@ -85,6 +85,7 @@ my %default = (
);
my $test_log_start = 0;
my $dry_run = 0;
my $ktest_config = "ktest.conf";
my $version;
@@ -587,7 +588,7 @@ sub end_monitor;
sub wait_for_monitor;
sub _logit {
if (defined($opt{"LOG_FILE"})) {
if (defined($opt{"LOG_FILE"}) && defined(fileno(LOG))) {
print LOG @_;
}
}
@@ -1365,6 +1366,9 @@ sub read_config {
print "$option\n";
}
print "Set IGNORE_UNUSED = 1 to have ktest ignore unused variables\n";
if ($dry_run) {
return;
}
if (!read_yn "Do you want to continue?") {
exit -1;
}
@@ -4249,6 +4253,53 @@ sub set_test_option {
return eval_option($name, $option, $i);
}
sub print_test_preamble {
my ($resolved) = @_;
doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
if (!$i) {
doprint "DEFAULT OPTIONS:\n";
} else {
doprint "\nTEST $i OPTIONS";
if (defined($repeat_tests{$i})) {
$repeat = $repeat_tests{$i};
doprint " ITERATE $repeat";
}
doprint "\n";
}
foreach my $option (sort keys %opt) {
my $value;
if ($option =~ /\[(\d+)\]$/) {
next if ($i != $1);
if ($resolved) {
my $name = $option;
$name =~ s/\[\d+\]$//;
$value = set_test_option($name, $i);
} else {
$value = $opt{$option};
}
} else {
next if ($i);
if ($resolved) {
$value = set_test_option($option, 0);
} else {
$value = $opt{$option};
}
}
$value = "" if (!defined($value));
doprint "$option = $value\n";
}
}
}
sub find_mailer {
my ($mailer) = @_;
@@ -4348,6 +4399,8 @@ ktest.pl version: $VERSION
Sets global BUILD_NOCLEAN to 1
-D TEST_TYPE[2]=build
Sets TEST_TYPE of test 2 to "build"
--dry-run
Print resolved test options and exit without running tests.
It can also override all temp variables.
-D USE_TEMP_DIR:=1
@@ -4379,6 +4432,9 @@ while ( $#ARGV >= 0 ) {
} else {
$command_vars[$#command_vars + 1] = $val;
}
} elsif ( $ARGV[0] eq "--dry-run" ) {
$dry_run = 1;
shift;
} elsif ( $ARGV[0] eq "-h" ) {
die_usage;
} else {
@@ -4427,6 +4483,11 @@ EOF
}
read_config $ktest_config;
if ($dry_run) {
print_test_preamble 1;
exit 0;
}
if (defined($opt{"LOG_FILE"})) {
$opt{"LOG_FILE"} = set_test_option("LOG_FILE", 1);
}
@@ -4458,31 +4519,7 @@ if (defined($opt{"LOG_FILE"})) {
LOG->autoflush(1);
}
doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
if (!$i) {
doprint "DEFAULT OPTIONS:\n";
} else {
doprint "\nTEST $i OPTIONS";
if (defined($repeat_tests{$i})) {
$repeat = $repeat_tests{$i};
doprint " ITERATE $repeat";
}
doprint "\n";
}
foreach my $option (sort keys %opt) {
if ($option =~ /\[(\d+)\]$/) {
next if ($i != $1);
} else {
next if ($i);
}
doprint "$option = $opt{$option}\n";
}
}
print_test_preamble 0;
$SIG{INT} = qw(cancel_test);