X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F01_basic.t;h=95e61b3c7100c943afe82eaeb39ae0c11587e7f5;hb=d4be4bd8bf54216cf2a58041f82f5fdaead5850a;hp=ac7f07a284255ea5d91371c75a88f59f14583494;hpb=41ec1eaf0c685813f08d5c10727b8d39c46f4aa4;p=p5sagit%2FDevel-GlobalDestruction.git diff --git a/t/01_basic.t b/t/01_basic.t index ac7f07a..95e61b3 100644 --- a/t/01_basic.t +++ b/t/01_basic.t @@ -2,32 +2,60 @@ use strict; use warnings; BEGIN { - if ($ENV{DEVEL_GLOBALDESTRUCTION_PP_TEST}) { - require DynaLoader; - no warnings 'redefine'; - my $orig = \&DynaLoader::bootstrap; - *DynaLoader::bootstrap = sub { - die 'no XS' if $_[0] eq 'Devel::GlobalDestruction'; - goto $orig; - }; - } + if ($ENV{DEVEL_GLOBALDESTRUCTION_PP_TEST}) { + unshift @INC, sub { + die 'no XS' if $_[1] eq 'Devel/GlobalDestruction/XS.pm'; + }; + } } BEGIN { - package Test::Scope::Guard; - sub new { my ($class, $code) = @_; bless [$code], $class; } - sub DESTROY { my $self = shift; $self->[0]->() } + package Test::Scope::Guard; + sub new { my ($class, $code) = @_; bless [$code], $class; } + sub DESTROY { my $self = shift; $self->[0]->() } } -print "1..6\n"; +print "1..9\n"; + +our $had_error; + +# try to ensure this is the last-most END so we capture future tests +# running in other ENDs +if ($[ >= 5.008) { + require B; + my $reinject_retries = my $max_retry = 5; + my $end_worker; + $end_worker = sub { + my $tail = (B::end_av()->ARRAY)[-1]; + if (!defined $tail or $tail == $end_worker) { + $? = $had_error || 0; + $reinject_retries = 0; + } + elsif ($reinject_retries--) { + push @{B::end_av()->object_2svref}, $end_worker; + } + else { + print STDERR "\n\nSomething is racing with @{[__FILE__]} for final END block definition - can't win after $max_retry iterations :(\n\n"; + require POSIX; + POSIX::_exit( 255 ); + } + }; + eval 'END { push @{B::end_av()->object_2svref}, $end_worker }'; +} +# B::end_av isn't available on 5.6, so just use a basic end block +else { + eval 'END { $? = $had_error || 0 }'; +} -my $had_error = 0; -END { $? = $had_error }; sub ok ($$) { - $had_error++, print "not " if !$_[0]; - print "ok"; - print " - $_[1]" if defined $_[1]; - print "\n"; + $had_error++, print "not " if !$_[0]; + print "ok"; + print " - $_[1]" if defined $_[1]; + print "\n"; +} + +END { + ok( ! in_global_destruction(), 'Not yet in GD while in END block 2' ) } ok( eval "use Devel::GlobalDestruction; 1", "use Devel::GlobalDestruction" ); @@ -38,6 +66,14 @@ ok( defined prototype \&in_global_destruction, "defined prototype" ); ok( prototype \&in_global_destruction eq "", "empty prototype" ); -ok( !in_global_destruction(), "not in GD" ); +ok( ! in_global_destruction(), "Runtime is not GD" ); + +our $sg1; +$sg1 = Test::Scope::Guard->new(sub { ok( in_global_destruction(), "Final cleanup object destruction properly in GD" ) }); + +END { + ok( ! in_global_destruction(), 'Not yet in GD while in END block 1' ) +} -our $sg = Test::Scope::Guard->new(sub { ok( in_global_destruction(), "in GD" ) }); +our $sg2 = Test::Scope::Guard->new(sub { ok( ! in_global_destruction(), "Object destruction in END not considered GD" ) }); +END { undef $sg2 }