diff options
author | Nicholas Clark <nick@ccl4.org> | 2009-09-01 10:54:48 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2009-09-01 10:54:48 +0100 |
commit | 71a94ed0dde4fbebc4c22e5f9f80d2e8586b85b4 (patch) | |
tree | 3e389d330e248408274db4d74351055e269cc2a5 | |
parent | 25a883e141ef5022e3a9afb466f7bc525d011947 (diff) | |
parent | 4013a0e1f891d6d7f41d456bab1a516334fddad8 (diff) | |
download | perl-71a94ed0dde4fbebc4c22e5f9f80d2e8586b85b4.tar.gz |
Merge commit 'origin/parallel_harness' into blead
-rwxr-xr-x | t/TEST | 111 | ||||
-rw-r--r-- | t/harness | 35 |
2 files changed, 112 insertions, 34 deletions
@@ -145,11 +145,11 @@ sub _scan_test { my $switch = ""; if ($first_line =~ /#!.*\bperl.*\s-\w*([tT])/) { - $switch = qq{"-$1"}; + $switch = "-$1"; } else { if ($::taintwarn) { # not all tests are expected to pass with this option - $switch = '"-t"'; + $switch = '-t'; } else { $switch = ''; } @@ -164,37 +164,26 @@ sub _scan_test { } } - return { file => $file_opts, switch => $switch }; -} - -sub _run_test { - my($harness, $test, $type) = @_; - if (!defined $type) { - # To conform to the interface expected by exec in TAP::Harness - $type = 'perl'; - } - - my $options = _scan_test($test, $type); - my $return_dir; + close $script; my $perl = './perl'; my $lib = '../lib'; + my $run_dir; + my $return_dir; + $test =~ /^(.+)\/[^\/]+/; my $dir = $1; - my $ext_dir; - my $testswitch = $dir_to_switch{$dir}; if (!defined $testswitch) { if ($test =~ s!^(\.\./ext/[^/]+)/t!t!) { - $ext_dir = $1; + $run_dir = $1; $return_dir = '../../t'; $lib = '../../lib'; $perl = '../../t/perl'; $testswitch = "-I../.. -MTestInit=U2T,A"; - if ($temp_no_core{$ext_dir}) { + if ($temp_no_core{$run_dir}) { $testswitch = $testswitch . ',NC'; } - chdir $ext_dir or die "Can't chdir to '$ext_dir': $!"; } else { $testswitch = '-I.. -MTestInit'; # -T will remove . from @INC } @@ -202,17 +191,38 @@ sub _run_test { my $utf8 = $::with_utf8 ? '-I$lib -Mutf8' : ''; - my $results; + return { + perl => $perl, + lib => $lib, + test => $test, + run_dir => $run_dir, + return_dir => $return_dir, + testswitch => $testswitch, + utf8 => $utf8, + file => $file_opts, + switch => $switch, + }; +} + +sub _cmd { + my($options, $type) = @_; + + my $test = $options->{test}; + + my $cmd; if ($type eq 'deparse') { - my $deparse_cmd = - "$perl $testswitch $options->{switch} -I$lib -MO=-qq,Deparse,-sv1.,". + my $perl = "$options->{perl} $options->{testswitch}"; + my $lib = $options->{lib}; + + $cmd = ( + "$perl $options->{switch} -I$lib -MO=-qq,Deparse,-sv1.,". "-l$::deparse_opts$options->{file} ". "$test > $test.dp ". - "&& $perl $testswitch $options->{switch} -I$lib $test.dp |"; - open($results, $deparse_cmd) - or print "can't deparse '$deparse_cmd': $!.\n"; + "&& $perl $options->{switch} -I$lib $test.dp" + ); } elsif ($type eq 'perl') { + my $perl = $options->{perl}; my $redir = $^O eq 'VMS' ? '2>&1' : ''; if ($ENV{PERL_VALGRIND}) { @@ -220,21 +230,60 @@ sub _run_test { my $vg_opts = $ENV{VG_OPTS} // "--suppressions=perl.supp --leak-check=yes " . "--leak-resolution=high --show-reachable=yes " - . "--num-callers=50"; + . "--num-callers=50"; $perl = "$valgrind --log-fd=3 $vg_opts $perl"; $redir = "3>$Valgrind_Log"; } - my $run = $perl . _quote_args("$testswitch $options->{switch} $utf8") - . " $test $redir|"; - open($results, $run) or print "can't run '$run': $!.\n"; + my $args = "$options->{testswitch} $options->{switch} $options->{utf8}"; + $cmd = $perl . _quote_args($args) . " $test $redir"; + } + + return $cmd; +} + +sub _before_fork { + my ($options) = @_; + + if ($options->{run_dir}) { + my $run_dir = $options->{run_dir}; + chdir $run_dir or die "Can't chdir to '$run_dir': $!"; } - if ($return_dir) { + return; +} + +sub _after_fork { + my ($options) = @_; + + if ($options->{return_dir}) { + my $return_dir = $options->{return_dir}; chdir $return_dir - or die "Can't chdir from '$ext_dir' to '$return_dir': $!"; + or die "Can't chdir from '$options->{run_dir}' to '$return_dir': $!"; } + return; +} + +sub _run_test { + my($harness, $test, $type) = @_; + if (!defined $type) { + # To conform to the interface expected by exec in TAP::Harness + $type = 'perl'; + } + + my $options = _scan_test($test, $type); + + $test = $options->{test}; # Might have changed if we're in ext/Foo + + _before_fork($options); + + my $cmd = _cmd($options, $type); + + open(my $results, "$cmd |") or print "can't run '$cmd': $!.\n"; + + _after_fork($options); + # Our environment may force us to use UTF-8, but we can't be sure that # anything we're reading from will be generating (well formed) UTF-8 # This may not be the best way - possibly we should unset ${^OPEN} up @@ -201,12 +201,29 @@ if ($^O eq 'MSWin32') { @tests=grep /$re/, @tests if $re; +my %options; + +my $type = 'perl'; + +# Load TAP::Parser now as otherwise it could be required in the short time span +# in which the harness process chdirs into ext/Dist +require TAP::Parser; + my $h = TAP::Harness->new({ rules => $rules, color => $color, jobs => $jobs, verbosity => $Verbose, - exec => \&_run_test, + exec => sub { + my ($harness, $test) = @_; + + my $options = $options{$test}; + if (!defined $options) { + $options = $options{$test} = _scan_test($test, $type); + } + + return [ split ' ', _cmd($options, $type) ]; + }, }); if ($state) { @@ -224,9 +241,21 @@ if ($state) { $h->callback( parser_args => sub { - my ( $args, $test ) = @_; - push @{ $args->{switches} }, '-I../lib'; + my ($args, $job) = @_; + my $test = $job->[0]; + _before_fork($options{$test}); + push @{ $args->{switches} }, "-I../../lib"; } ); + +$h->callback( + made_parser => sub { + my ($parser, $job) = @_; + my $test = $job->[0]; + my $options = delete $options{$test}; + _after_fork($options); + } + ); + $h->runtests(@tests); exit(0); |