7 # All in file: run-tests.pl file
8 # Nth in file: run-tests.pl file N
11 use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG);
12 use File::Basename qw(basename dirname);
14 use IPC::Open2 qw(open2);
16 my @TYPES = qw(tfn op action);
17 my $TEST = "./msc_test";
18 my $SCRIPT = basename($0);
19 my $SCRIPTDIR = dirname($0);
22 my $DEBUG = $ENV{MSC_TEST_DEBUG} || 0;
24 if (defined $ARGV[0]) {
25 runfile(dirname($ARGV[0]), basename($ARGV[0]), $ARGV[1]);
29 for my $type (sort @TYPES) {
30 my $dir = "$SCRIPTDIR/$type";
34 opendir(DIR, "$dir") or quit(1, "Failed to open \"$dir\": $!");
35 @cfg = grep { /\.t$/ && -f "$dir/$_" } readdir(DIR);
38 for my $cfg (sort @cfg) {
47 my($dir, $cfg, $testnum) = @_;
57 open(CFG, "<$fn") or quit(1, "Failed to open \"$fn\": $!");
60 $edata = q/@C = (/ . join("", @data) . q/)/;
62 quit(1, "Failed to read test data \"$cfg\": $@") if ($@);
65 msg("\nNo tests defined for $fn");
69 msg("\nLoaded ".@C." tests from $fn");
72 next if (defined $testnum and $n != $testnum);
75 my $id = sprintf("%6d", $n);
76 my $in = (exists($t{input}) and defined($t{input})) ? $t{input} : "";
78 my $test_in = new FileHandle();
79 my $test_out = new FileHandle();
84 if ($t{type} eq "tfn") {
85 $param = escape($t{output});
87 elsif ($t{type} eq "op") {
88 $param = escape($t{param});
90 elsif ($t{type} eq "action") {
91 $param = escape($t{param});
94 quit(1, "Unknown type \"$t{type}\" - should be one of: " . join(",",@TYPES));
97 @test = ("-t", $t{type}, "-n", $t{name}, "-p", $param, "-D", "$DEBUG", (exists($t{ret}) ? ("-r", $t{ret}) : ()), (exists($t{iterations}) ? ("-I", $t{iterations}) : ()), (exists($t{prerun}) ? ("-P", $t{prerun}) : ()));
98 $teststr = "$TEST " . join(" ", map { "\"$_\"" } @test);
99 $test_pid = open2($test_out, $test_in, $TEST, @test) or quit(1, "Failed to execute test: $teststr\": $!");
100 print $test_in "$in";
102 $out = join("\\n", split(/\n/, <$test_out>));
104 waitpid($test_pid, 0);
107 if ( WIFEXITED($rc) ) {
108 $rc = WEXITSTATUS($rc);
110 elsif( WIFSIGNALED($rc) ) {
111 msg("Test exited with signal " . WTERMSIG($rc) . ".");
112 msg("Executed: $teststr");
116 msg("Test exited with unknown error.");
124 msg(sprintf("%s) %s \"%s\"%s: %s%s", $id, $t{type}, $t{name}, (exists($t{comment}) ? " $t{comment}" : ""), ($rc ? "failed" : "passed"), ((defined($out) && $out ne "")? " ($out)" : "")));
128 $TOTAL += $testnum ? 1 : $n;
131 msg(sprintf("Passed: %2d; Failed: %2d", $pass, $testnum ? (1 - $pass) : ($n - $pass)));
136 for my $c (split(//, $_[0])) {
137 push @new, ((ord($c) >= 0x20 and ord($c) <= 0x7e) ? $c : sprintf("\\x%02x", ord($c)));
143 print STDOUT "@_\n" if (@_);
148 $ec = 0 unless (defined $_[0]);
150 msg("$msg") if (defined $msg);
156 if ($PASSED != $TOTAL) {
157 quit(1, "\n$PASSED/$TOTAL tests passed.");
160 quit(0, "\nAll tests passed ($TOTAL).");