xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/exit.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
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