Blame tests/run-unit-tests.pl.in

Packit Service 384592
#!@PERL@
Packit Service 384592
#
Packit Service 384592
# Run unit tests.
Packit Service 384592
#
Packit Service 384592
# Syntax:
Packit Service 384592
#          All: run-tests.pl
Packit Service 384592
#     All in file: run-tests.pl file
Packit Service 384592
#     Nth in file: run-tests.pl file N
Packit Service 384592
#
Packit Service 384592
use strict;
Packit Service 384592
use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG);
Packit Service 384592
use File::Basename qw(basename dirname);
Packit Service 384592
use FileHandle;
Packit Service 384592
use IPC::Open2 qw(open2);
Packit Service 384592
Packit Service 384592
my @TYPES = qw(tfn op action);
Packit Service 384592
my $TEST = "./msc_test";
Packit Service 384592
my $SCRIPT = basename($0);
Packit Service 384592
my $SCRIPTDIR = dirname($0);
Packit Service 384592
my $PASSED = 0;
Packit Service 384592
my $TOTAL = 0;
Packit Service 384592
my $DEBUG = $ENV{MSC_TEST_DEBUG} || 0;
Packit Service 384592
Packit Service 384592
if (defined $ARGV[0]) {
Packit Service 384592
    runfile(dirname($ARGV[0]), basename($ARGV[0]), $ARGV[1]);
Packit Service 384592
    done();
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
for my $type (sort @TYPES) {
Packit Service 384592
    my $dir = "$SCRIPTDIR/$type";
Packit Service 384592
    my @cfg = ();
Packit Service 384592
Packit Service 384592
    # Get test names
Packit Service 384592
    opendir(DIR, "$dir") or quit(1, "Failed to open \"$dir\": $!");
Packit Service 384592
    @cfg = grep { /\.t$/ && -f "$dir/$_" } readdir(DIR);
Packit Service 384592
    closedir(DIR);
Packit Service 384592
Packit Service 384592
    for my $cfg (sort @cfg) {
Packit Service 384592
        runfile($dir, $cfg);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
}
Packit Service 384592
done();
Packit Service 384592
Packit Service 384592
Packit Service 384592
sub runfile {
Packit Service 384592
    my($dir, $cfg, $testnum) = @_;
Packit Service 384592
    my $fn = "$dir/$cfg";
Packit Service 384592
    my @data = ();
Packit Service 384592
    my $edata;
Packit Service 384592
    my @C = ();
Packit Service 384592
    my @test = ();
Packit Service 384592
    my $teststr;
Packit Service 384592
    my $n = 0;
Packit Service 384592
    my $pass = 0;
Packit Service 384592
Packit Service 384592
    open(CFG, "<$fn") or quit(1, "Failed to open \"$fn\": $!");
Packit Service 384592
    @data = <CFG>;
Packit Service 384592
    
Packit Service 384592
    $edata = q/@C = (/ . join("", @data) . q/)/;
Packit Service 384592
    eval $edata;
Packit Service 384592
    quit(1, "Failed to read test data \"$cfg\": $@") if ($@);
Packit Service 384592
Packit Service 384592
    unless (@C) {
Packit Service 384592
        msg("\nNo tests defined for $fn");
Packit Service 384592
        return;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    msg("\nLoaded ".@C." tests from $fn");
Packit Service 384592
    for my $t (@C) {
Packit Service 384592
        $n++;
Packit Service 384592
        next if (defined $testnum and $n != $testnum);
Packit Service 384592
Packit Service 384592
        my %t = %{$t || {}};
Packit Service 384592
        my $id = sprintf("%6d", $n);
Packit Service 384592
        my $in = (exists($t{input}) and defined($t{input})) ? $t{input} : "";
Packit Service 384592
        my $out;
Packit Service 384592
        my $test_in = new FileHandle();
Packit Service 384592
        my $test_out = new FileHandle();
Packit Service 384592
        my $test_pid;
Packit Service 384592
        my $rc = 0;
Packit Service 384592
        my $param;
Packit Service 384592
Packit Service 384592
        if ($t{type} eq "tfn") {
Packit Service 384592
            $param = escape($t{output});
Packit Service 384592
        }
Packit Service 384592
        elsif ($t{type} eq "op") {
Packit Service 384592
            $param = escape($t{param});
Packit Service 384592
        }
Packit Service 384592
        elsif ($t{type} eq "action") {
Packit Service 384592
            $param = escape($t{param});
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            quit(1, "Unknown type \"$t{type}\" - should be one of: " . join(",",@TYPES));
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        @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}) : ()));
Packit Service 384592
        $teststr = "$TEST " . join(" ", map { "\"$_\"" } @test);
Packit Service 384592
        $test_pid = open2($test_out, $test_in, $TEST, @test) or quit(1, "Failed to execute test: $teststr\": $!");
Packit Service 384592
        print $test_in "$in";
Packit Service 384592
        close $test_in;
Packit Service 384592
        $out = join("\\n", split(/\n/, <$test_out>));
Packit Service 384592
        close $test_out;
Packit Service 384592
        waitpid($test_pid, 0);
Packit Service 384592
Packit Service 384592
        $rc = $?;
Packit Service 384592
        if ( WIFEXITED($rc) ) {
Packit Service 384592
            $rc = WEXITSTATUS($rc);
Packit Service 384592
        }
Packit Service 384592
        elsif( WIFSIGNALED($rc) ) {
Packit Service 384592
            msg("Test exited with signal " . WTERMSIG($rc) . ".");
Packit Service 384592
            msg("Executed: $teststr");
Packit Service 384592
            $rc = -1;
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            msg("Test exited with unknown error.");
Packit Service 384592
            $rc = -1;
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        if ($rc == 0) {
Packit Service 384592
            $pass++;
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        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)" : "")));
Packit Service 384592
        
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    $TOTAL += $testnum ? 1 : $n;
Packit Service 384592
    $PASSED += $pass;
Packit Service 384592
Packit Service 384592
    msg(sprintf("Passed: %2d; Failed: %2d", $pass, $testnum ? (1 - $pass) : ($n - $pass)));
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
sub escape {
Packit Service 384592
    my @new = ();
Packit Service 384592
    for my $c (split(//, $_[0])) {
Packit Service 384592
        push @new, ((ord($c) >= 0x20 and ord($c) <= 0x7e) ? $c : sprintf("\\x%02x", ord($c)));
Packit Service 384592
    }
Packit Service 384592
    join('', @new);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
sub msg {
Packit Service 384592
    print STDOUT "@_\n" if (@_);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
sub quit {
Packit Service 384592
    my($ec,$msg) = @_;
Packit Service 384592
    $ec = 0 unless (defined $_[0]);
Packit Service 384592
Packit Service 384592
    msg("$msg") if (defined $msg);
Packit Service 384592
Packit Service 384592
    exit $ec;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
sub done {
Packit Service 384592
    if ($PASSED != $TOTAL) {
Packit Service 384592
        quit(1, "\n$PASSED/$TOTAL tests passed.");
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    quit(0, "\nAll tests passed ($TOTAL).");
Packit Service 384592
}