1#!perl -T 2# -*- mode: cperl ; compile-command: "cd .. ; ./Build ; prove -vb t/04-*.t" -*- 3 4BEGIN { $_ = defined && /(.*)/ && $1 for @ENV{qw/ TMPDIR TEMP TMP /} } # taint vs tempfile 5use Test::More tests => 9; 6use strict; 7use warnings; 8 9my ($done_exit, $ready_for_exit); 10BEGIN { 11 *CORE::GLOBAL::exit = sub(;$) { 12 ok($ready_for_exit, "The outer CORE::GLOBAL::exit isn't called too early"); 13 $done_exit++; 14 CORE::exit(@_ ? shift : 0); 15 }; 16} 17END{ 18 ok($done_exit, "The final test: The outer CORE::GLOBAL::exit is eventually called"); 19} 20 21BEGIN { 22 use_ok( 'Test::Trap' ); 23} 24 25# test the $! handling: 26my $errnum = 11; # "Resource temporarily unavailable" locally -- sounds good :-P 27my $errstring = do { local $! = $errnum; "$!" }; 28my $erros = do { local $! = $errnum; $^E }; 29my ($errsym) = do { local $! = $errnum; grep { $!{$_} } keys(%!) }; 30 31$! = $errnum; 32 33trap { exit }; 34is( $trap->exit, 0, "Trapped the first exit"); 35trap { 36 *CORE::GLOBAL::exit = sub(;$) { 37 fail("Should be overridden"); 38 CORE::exit(@_ ? shift : 0); 39 }; 40 trap { exit }; 41 is( $trap->exit, 0, "Trapped the inner exit"); 42}; 43like( $trap->stderr, qr/^Subroutine (?:CORE::GLOBAL::)?exit redefined at \Q${\__FILE__} line/, 'Override warning' ); 44 45my ($sym) = grep { $!{$_} } keys(%!); 46# rt.cpan.org #105125: Test::More::is() does not preserve $^E, so ... 47my $postos = $^E; 48is $!+0, $errnum, "These traps don't change errno (remains $errnum/$errstring)"; 49is $postos, $erros, "These traps don't change extended OS error (remains $erros)"; 50is $sym, $errsym, "These traps don't change the error symbol (remains $errsym)"; 51 52$ready_for_exit++; 53 54exit; 55