qpdf/run-qtest

146 lines
2.9 KiB
Perl
Executable File

#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;
use Cwd 'abs_path';
use File::Basename;
use File::Spec;
my $whoami = basename($0);
my $top = undef;
my $code = undef;
my @bin = ();
my $color = undef;
my $show_on_failure = 0;
my $disable_tc = 0;
my @tc = ();
if ($^O =~ m/^MSWin32|msys$/)
{
for (@ARGV)
{
s,^([A-Z]):/,/\L$1\E/,;
}
}
while (@ARGV)
{
my $arg = shift(@ARGV);
if ($arg eq '--top')
{
usage() unless @ARGV;
$top = shift(@ARGV);
}
elsif ($arg eq '--code')
{
usage() unless @ARGV;
$code = shift(@ARGV);
}
elsif ($arg eq '--bin')
{
usage() unless @ARGV;
push(@bin, shift(@ARGV));
}
elsif ($arg eq '--color')
{
usage() unless @ARGV;
$color = cmake_bool(shift(@ARGV));
}
elsif ($arg eq '--show-on-failure')
{
usage() unless @ARGV;
$show_on_failure = cmake_bool(shift(@ARGV));
}
elsif ($arg eq '--disable-tc')
{
$disable_tc = 1;
}
elsif ($arg eq '--tc')
{
usage() unless @ARGV;
while (@ARGV && ($ARGV[0] !~ m/^--/))
{
# On Windows, a literal glob in quotes is expanded by the
# shell, so we have to handle globs when expanded by the
# shell by consuming arguments until the next --.
my $t = shift(@ARGV);
if (exists $ENV{'TESTS'})
{
# No point enabling coverage if we're intentionally
# running only a subset of tests.
next;
}
push(@tc, $t);
}
}
elsif ($arg eq '--env')
{
usage() unless @ARGV;
my $var = shift(@ARGV);
usage() unless $var =~ m/^([^=]+)=(.*)$/;
$ENV{$1} = $2;
}
else
{
usage();
}
}
usage() unless (defined $top && defined $code && scalar(@bin));
my @cmd = ("$top/qtest/bin/qtest-driver");
if (defined $color)
{
push(@cmd, "-stdout-tty=$color");
}
push(@cmd,
"-bindirs", join(':', @bin),
"-datadir", "$code/qtest",
"-junit-suffix", basename($code));
if (scalar(@tc) && (! $disable_tc))
{
my @tc_srcs = map {
File::Spec->abs2rel(abs_path($_))
} map {
# On non-Windows, a literal glob in quotes is not expanded by
# the shell, so we have to handle globs explicitly.
glob($_)
} @tc;
$ENV{'TC_SRCS'} = join(' ', @tc_srcs);
push(@cmd, "-covdir", $code);
}
my $r = system(@cmd);
if (($r != 0) && $show_on_failure && open(R, "<qtest.log"))
{
binmode R;
while (<R>)
{
print;
}
close(R);
}
exit($r == 0 ? 0 : 2);
sub cmake_bool
{
my $arg = shift;
($arg =~ m/^(1|on|true|y(es)?)$/i) ? 1 : 0;
}
sub usage
{
die "
Usage: $whoami options
--top source-tree
--code code-subdir
--bin bindir ...
[--color [01]]
[--show-on-failure [01]]
[--tc \"../a/*.cc\" ...]
";
}