X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Ftest.pl;h=32c4a374e5dfeaca47821909207f4c5b2e5f6b40;hb=0e945d0082cb70df3b6da49ba9241db5ee15f208;hp=f0b4879674ae7248e582d5aea7adab2fc513a5c4;hpb=c1ddc35c47e1b3519bfe90eecd67145f73c0f30a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/test.pl b/t/test.pl index f0b4879..32c4a37 100644 --- a/t/test.pl +++ b/t/test.pl @@ -527,12 +527,11 @@ sub runperl { # 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); @@ -573,12 +572,11 @@ sub which_perl { 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; @@ -588,8 +586,7 @@ sub which_perl { 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 { @@ -619,8 +616,11 @@ sub unlink_all { } } -my @tmpfiles; -END { unlink_all @tmpfiles } +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); @@ -631,11 +631,13 @@ sub tempfile { my $try = "tmp$$"; do { $try .= $letters[$temp % 26]; - $count = int ($temp / 26); + $temp = int ($temp / 26); } while $temp; - if (!-e $try) { + # 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 - push @tmpfiles, $try; + $tmpfiles{$try}++; return $try; } $count = $count + 1; @@ -680,8 +682,8 @@ sub _fresh_perl { # Clean up the results into something a bit more predictable. $results =~ s/\n+$//; - $results =~ s/at\s+tmp\d+[A-Z][A-Z]?\s+line/at - line/g; - $results =~ s/of\s+tmp\d+[A-Z][A-Z]?\s+aborted/of - aborted/g; + $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'. @@ -838,10 +840,11 @@ sub watchdog ($) local $SIG{'__WARN__'} = sub { _diag("Watchdog warning: $_[0]"); }; + my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL'; $watchdog = system(1, which_perl(), '-e', "sleep($timeout);" . "warn('# $timeout_msg\n');" . - "kill('KILL', $pid_to_kill);"); + "kill($sig, $pid_to_kill);"); }; if ($@ || ($watchdog <= 0)) { _diag('Failed to start watchdog'); @@ -897,19 +900,23 @@ sub watchdog ($) # 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; } @@ -924,7 +931,8 @@ sub watchdog ($) 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); }; } }