sub skip_all {
if (@_) {
- _print "1..0 # Skipped: @_\n";
+ _print "1..0 # Skip @_\n";
} else {
_print "1..0\n";
}
my $why = shift;
my $n = @_ ? shift : 1;
for (1..$n) {
- _print "ok $test # skip: $why\n";
+ _print "ok $test # skip $why\n";
$test = $test + 1;
}
local $^W = 0;
my $n = @_ ? shift : 1;
for (1..$n) {
- _print "not ok $test # TODO & SKIP: $why\n";
+ _print "not ok $test # TODO & SKIP $why\n";
$test = $test + 1;
}
local $^W = 0;
# run a fresh perl, so we'll brute force launder everything for you
my $sep;
- eval "require Config; Config->import";
- if ($@) {
+ if (! eval 'require Config; 1') {
warn "test.pl had problems loading Config: $@";
$sep = ':';
} else {
- $sep = $Config{path_sep};
+ $sep = $Config::Config{path_sep};
}
my @keys = grep {exists $ENV{$_}} qw(CDPATH IFS ENV BASH_ENV);
return $Perl if $^O eq 'VMS';
my $exe;
- eval "require Config; Config->import";
- if ($@) {
+ if (! eval 'require Config; 1') {
warn "test.pl had problems loading Config: $@";
$exe = '';
} else {
- $exe = $Config{_exe};
+ $exe = $Config::Config{_exe};
}
$exe = '' unless defined $exe;
if ($Perl =~ /^perl\Q$exe\E$/i) {
my $perl = "perl$exe";
- eval "require File::Spec";
- if ($@) {
+ if (! eval 'require File::Spec; 1') {
warn "test.pl had problems loading File::Spec: $@";
$Perl = "./$perl";
} else {
}
}
+my %tmpfiles;
+END { unlink_all keys %tmpfiles }
+
+# A regexp that matches the tempfile names
+$::tempfile_regexp = 'tmp\d+[A-Z][A-Z]?';
+
+# Avoid ++, avoid ranges, avoid split //
+my @letters = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
+sub tempfile {
+ my $count = 0;
+ do {
+ my $temp = $count;
+ my $try = "tmp$$";
+ do {
+ $try .= $letters[$temp % 26];
+ $temp = int ($temp / 26);
+ } while $temp;
+ # Need to note all the file names we allocated, as a second request may
+ # come before the first is created.
+ if (!-e $try && !$tmpfiles{$try}) {
+ # We have a winner
+ $tmpfiles{$try}++;
+ return $try;
+ }
+ $count = $count + 1;
+ } while $count < 26 * 26;
+ die "Can't find temporary file name starting 'tmp$$'";
+}
-my $tmpfile = "misctmp000";
-1 while -f ++$tmpfile;
-END { unlink_all $tmpfile }
+# This is the temporary file for _fresh_perl
+my $tmpfile = tempfile();
#
# _fresh_perl
my $status = $?;
# Clean up the results into something a bit more predictable.
- $results =~ s/\n+$//;
- $results =~ s/at\s+misctmp\d+\s+line/at - line/g;
- $results =~ s/of\s+misctmp\d+\s+aborted/of - aborted/g;
+ $results =~ s/\n+$//;
+ $results =~ s/at\s+$::tempfile_regexp\s+line/at - line/g;
+ $results =~ s/of\s+$::tempfile_regexp\s+aborted/of - aborted/g;
# bison says 'parse error' instead of 'syntax error',
# various yaccs may or may not capitalize 'syntax'.
sub fresh_perl_is {
my($prog, $expected, $runperl_args, $name) = @_;
+
+ # _fresh_perl() is going to clip the trailing newlines off the result.
+ # This will make it so the test author doesn't have to know that.
+ $expected =~ s/\n+$//;
+
local $Level = 2;
_fresh_perl($prog,
sub { @_ ? $_[0] eq $expected : $expected },
local $SIG{'__WARN__'} = sub {
_diag("Watchdog warning: $_[0]");
};
+ my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL';
$watchdog = system(1, which_perl(), '-e',
"sleep($timeout);" .
- "kill('KILL', $pid_to_kill);");
+ "warn('# $timeout_msg\n');" .
+ "kill($sig, $pid_to_kill);");
};
if ($@ || ($watchdog <= 0)) {
_diag('Failed to start watchdog');
# Add END block to parent to terminate and
# clean up watchdog process
- eval "END { local \$!; local \$?;
- wait() if kill('KILL', $watchdog); }";
+ eval "END { local \$! = 0; local \$? = 0;
+ wait() if kill('KILL', $watchdog); };";
return;
}
if ($watchdog) { # Parent process
# Add END block to parent to terminate and
# clean up watchdog process
- eval "END { local \$!; local \$?;
- wait() if kill('KILL', $watchdog); }";
+ eval "END { local \$! = 0; local \$? = 0;
+ wait() if kill('KILL', $watchdog); };";
return;
}
# Use a watchdog thread because either 'threads' is loaded,
# or fork() failed
- if (eval { require threads; }) {
+ if (eval 'require threads; 1') {
threads->create(sub {
# Load POSIX if available
eval { require POSIX; };
# Execute the timeout
- sleep($timeout);
+ my $time_left = $timeout;
+ do {
+ $time_left -= sleep($time_left);
+ } while ($time_left > 0);
# Kill the parent (and ourself)
select(STDERR); $| = 1;
_diag($timeout_msg);
POSIX::_exit(1) if (defined(&POSIX::_exit));
- kill('KILL', $pid_to_kill);
+ my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL';
+ kill($sig, $pid_to_kill);
})->detach();
return;
}
select(STDERR); $| = 1;
_diag($timeout_msg);
POSIX::_exit(1) if (defined(&POSIX::_exit));
- kill('KILL', $pid_to_kill);
+ my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL';
+ kill($sig, $pid_to_kill);
};
}
}