1*5759b3d2Safresh1#!/usr/bin/perl -w 2*5759b3d2Safresh1# HARNESS-NO-STREAM 3*5759b3d2Safresh1 4*5759b3d2Safresh1# Can't use Test.pm, that's a 5.005 thing. 5*5759b3d2Safresh1package My::Test; 6*5759b3d2Safresh1 7*5759b3d2Safresh1BEGIN { 8*5759b3d2Safresh1 if( $ENV{PERL_CORE} ) { 9*5759b3d2Safresh1 chdir 't'; 10*5759b3d2Safresh1 @INC = '../lib'; 11*5759b3d2Safresh1 } 12*5759b3d2Safresh1} 13*5759b3d2Safresh1 14*5759b3d2Safresh1require Test::Builder; 15*5759b3d2Safresh1my $TB = Test::Builder->create(); 16*5759b3d2Safresh1$TB->level(0); 17*5759b3d2Safresh1 18*5759b3d2Safresh1 19*5759b3d2Safresh1package main; 20*5759b3d2Safresh1 21*5759b3d2Safresh1use Cwd; 22*5759b3d2Safresh1use File::Spec; 23*5759b3d2Safresh1 24*5759b3d2Safresh1my $Orig_Dir = cwd; 25*5759b3d2Safresh1 26*5759b3d2Safresh1my $Perl = File::Spec->rel2abs($^X); 27*5759b3d2Safresh1if( $^O eq 'VMS' ) { 28*5759b3d2Safresh1 # VMS can't use its own $^X in a system call until almost 5.8 29*5759b3d2Safresh1 $Perl = "MCR $^X" if $] < 5.007003; 30*5759b3d2Safresh1 31*5759b3d2Safresh1 # Quiet noisy 'SYS$ABORT' 32*5759b3d2Safresh1 $Perl .= q{ -"I../lib"} if $ENV{PERL_CORE}; 33*5759b3d2Safresh1 $Perl .= q{ -"Mvmsish=hushed"}; 34*5759b3d2Safresh1} else { 35*5759b3d2Safresh1 $Perl = qq("$Perl"); # protect from shell if spaces 36*5759b3d2Safresh1} 37*5759b3d2Safresh1 38*5759b3d2Safresh1eval { require POSIX; &POSIX::WEXITSTATUS(0) }; 39*5759b3d2Safresh1if( $@ ) { 40*5759b3d2Safresh1 *exitstatus = sub { $_[0] >> 8 }; 41*5759b3d2Safresh1} 42*5759b3d2Safresh1else { 43*5759b3d2Safresh1 *exitstatus = sub { POSIX::WEXITSTATUS($_[0]) } 44*5759b3d2Safresh1} 45*5759b3d2Safresh1 46*5759b3d2Safresh1 47*5759b3d2Safresh1# Some OS' will alter the exit code to their own native sense... 48*5759b3d2Safresh1# sometimes. Rather than deal with the exception we'll just 49*5759b3d2Safresh1# build up the mapping. 50*5759b3d2Safresh1print "# Building up a map of exit codes. May take a while.\n"; 51*5759b3d2Safresh1my %Exit_Map; 52*5759b3d2Safresh1 53*5759b3d2Safresh1open my $fh, ">", "exit_map_test" or die $!; 54*5759b3d2Safresh1print $fh <<'DONE'; 55*5759b3d2Safresh1if ($^O eq 'VMS') { 56*5759b3d2Safresh1 require vmsish; 57*5759b3d2Safresh1 import vmsish qw(hushed); 58*5759b3d2Safresh1} 59*5759b3d2Safresh1my $exit = shift; 60*5759b3d2Safresh1print "exit $exit\n"; 61*5759b3d2Safresh1END { $? = $exit }; 62*5759b3d2Safresh1DONE 63*5759b3d2Safresh1 64*5759b3d2Safresh1close $fh; 65*5759b3d2Safresh1END { 1 while unlink "exit_map_test" } 66*5759b3d2Safresh1 67*5759b3d2Safresh1for my $exit (0..255) { 68*5759b3d2Safresh1 # This correctly emulates Test::Builder's behavior. 69*5759b3d2Safresh1 my $out = qx[$Perl exit_map_test $exit]; 70*5759b3d2Safresh1 $TB->like( $out, qr/^exit $exit\n/, "exit map test for $exit" ); 71*5759b3d2Safresh1 $Exit_Map{$exit} = exitstatus($?); 72*5759b3d2Safresh1} 73*5759b3d2Safresh1print "# Done.\n"; 74*5759b3d2Safresh1 75*5759b3d2Safresh1 76*5759b3d2Safresh1my %Tests = ( 77*5759b3d2Safresh1 # File Exit Code 78*5759b3d2Safresh1 'success.plx' => 0, 79*5759b3d2Safresh1 'one_fail.plx' => 1, 80*5759b3d2Safresh1 'two_fail.plx' => 2, 81*5759b3d2Safresh1 'five_fail.plx' => 5, 82*5759b3d2Safresh1 'extras.plx' => 2, 83*5759b3d2Safresh1 'too_few.plx' => 255, 84*5759b3d2Safresh1 'too_few_fail.plx' => 2, 85*5759b3d2Safresh1 'death.plx' => 255, 86*5759b3d2Safresh1 'last_minute_death.plx' => 255, 87*5759b3d2Safresh1 'pre_plan_death.plx' => 'not zero', 88*5759b3d2Safresh1 'death_in_eval.plx' => 0, 89*5759b3d2Safresh1 'require.plx' => 0, 90*5759b3d2Safresh1 'death_with_handler.plx' => 255, 91*5759b3d2Safresh1 'exit.plx' => 1, 92*5759b3d2Safresh1 'one_fail_without_plan.plx' => 1, 93*5759b3d2Safresh1 'missing_done_testing.plx' => 254, 94*5759b3d2Safresh1 ); 95*5759b3d2Safresh1 96*5759b3d2Safresh1chdir 't'; 97*5759b3d2Safresh1my $lib = File::Spec->catdir(qw(lib Test Simple sample_tests)); 98*5759b3d2Safresh1while( my($test_name, $exit_code) = each %Tests ) { 99*5759b3d2Safresh1 my $file = File::Spec->catfile($lib, $test_name); 100*5759b3d2Safresh1 my $wait_stat = system(qq{$Perl -"I../blib/lib" -"I../lib" -"I../t/lib" $file}); 101*5759b3d2Safresh1 my $actual_exit = exitstatus($wait_stat); 102*5759b3d2Safresh1 103*5759b3d2Safresh1 if( $exit_code eq 'not zero' ) { 104*5759b3d2Safresh1 $TB->isnt_num( $actual_exit, $Exit_Map{0}, 105*5759b3d2Safresh1 "$test_name exited with $actual_exit ". 106*5759b3d2Safresh1 "(expected non-zero)"); 107*5759b3d2Safresh1 } 108*5759b3d2Safresh1 else { 109*5759b3d2Safresh1 $TB->is_num( $actual_exit, $Exit_Map{$exit_code}, 110*5759b3d2Safresh1 "$test_name exited with $actual_exit ". 111*5759b3d2Safresh1 "(expected $Exit_Map{$exit_code})"); 112*5759b3d2Safresh1 } 113*5759b3d2Safresh1} 114*5759b3d2Safresh1 115*5759b3d2Safresh1$TB->done_testing( scalar keys(%Tests) + 256 ); 116*5759b3d2Safresh1 117*5759b3d2Safresh1# So any END block file cleanup works. 118*5759b3d2Safresh1chdir $Orig_Dir; 119