|
Packit |
f32316 |
use strict;
|
|
Packit |
f32316 |
use warnings;
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
BEGIN {
|
|
Packit |
f32316 |
if ($ENV{DEVEL_GLOBALDESTRUCTION_PP_TEST}) {
|
|
Packit |
f32316 |
unshift @INC, sub {
|
|
Packit |
f32316 |
die 'no XS' if $_[1] eq 'Devel/GlobalDestruction/XS.pm';
|
|
Packit |
f32316 |
};
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
BEGIN {
|
|
Packit |
f32316 |
package Test::Scope::Guard;
|
|
Packit |
f32316 |
sub new { my ($class, $code) = @_; bless [$code], $class; }
|
|
Packit |
f32316 |
sub DESTROY { my $self = shift; $self->[0]->() }
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
print "1..9\n";
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
our $had_error;
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
# try to ensure this is the last-most END so we capture future tests
|
|
Packit |
f32316 |
# running in other ENDs
|
|
Packit |
f32316 |
if ($] >= 5.008) {
|
|
Packit |
f32316 |
require B;
|
|
Packit |
f32316 |
my $reinject_retries = my $max_retry = 5;
|
|
Packit |
f32316 |
my $end_worker;
|
|
Packit |
f32316 |
$end_worker = sub {
|
|
Packit |
f32316 |
my $tail = (B::end_av()->ARRAY)[-1];
|
|
Packit |
f32316 |
if (!defined $tail or $tail == $end_worker) {
|
|
Packit |
f32316 |
$? = $had_error || 0;
|
|
Packit |
f32316 |
$reinject_retries = 0;
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
elsif ($reinject_retries--) {
|
|
Packit |
f32316 |
push @{B::end_av()->object_2svref}, $end_worker;
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
else {
|
|
Packit |
f32316 |
print STDERR "\n\nSomething is racing with @{[__FILE__]} for final END block definition - can't win after $max_retry iterations :(\n\n";
|
|
Packit |
f32316 |
require POSIX;
|
|
Packit |
f32316 |
POSIX::_exit( 255 );
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
};
|
|
Packit |
f32316 |
eval 'END { push @{B::end_av()->object_2svref}, $end_worker }';
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
# B::end_av isn't available on 5.6, so just use a basic end block
|
|
Packit |
f32316 |
else {
|
|
Packit |
f32316 |
eval 'END { $? = $had_error || 0 }';
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
sub ok ($$) {
|
|
Packit |
f32316 |
$had_error++, print "not " if !$_[0];
|
|
Packit |
f32316 |
print "ok";
|
|
Packit |
f32316 |
print " - $_[1]" if defined $_[1];
|
|
Packit |
f32316 |
print "\n";
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
END {
|
|
Packit |
f32316 |
ok( ! in_global_destruction(), 'Not yet in GD while in END block 2' )
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
ok( eval "use Devel::GlobalDestruction; 1", "use Devel::GlobalDestruction" );
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
ok( defined &in_global_destruction, "exported" );
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
ok( defined prototype \&in_global_destruction, "defined prototype" );
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
ok( prototype \&in_global_destruction eq "", "empty prototype" );
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
ok( ! in_global_destruction(), "Runtime is not GD" );
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
our $sg1;
|
|
Packit |
f32316 |
$sg1 = Test::Scope::Guard->new(sub { ok( in_global_destruction(), "Final cleanup object destruction properly in GD" ) });
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
END {
|
|
Packit |
f32316 |
ok( ! in_global_destruction(), 'Not yet in GD while in END block 1' )
|
|
Packit |
f32316 |
}
|
|
Packit |
f32316 |
|
|
Packit |
f32316 |
our $sg2 = Test::Scope::Guard->new(sub { ok( ! in_global_destruction(), "Object destruction in END not considered GD" ) });
|
|
Packit |
f32316 |
END { undef $sg2 }
|