X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2FDBICTest%2FUtil.pm;h=0cd2b12799d1a556b1757e36e4bf28acba672e3d;hb=9ee23fb6415c37b55ec1dc506bd25ccb778bc623;hp=9f5e98575b559c97734cddf0286c907aa297f448;hpb=6918c70e3970b631dd6f4e298a87ae02476fbde1;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/lib/DBICTest/Util.pm b/t/lib/DBICTest/Util.pm index 9f5e985..0cd2b12 100644 --- a/t/lib/DBICTest/Util.pm +++ b/t/lib/DBICTest/Util.pm @@ -3,11 +3,31 @@ package DBICTest::Util; use warnings; use strict; -use Carp; -use Scalar::Util qw/isweak weaken blessed reftype refaddr/; +use Config; use base 'Exporter'; -our @EXPORT_OK = qw/stacktrace populate_weakregistry assert_empty_weakregistry/; +our @EXPORT_OK = qw/local_umask stacktrace/; + +sub local_umask { + return unless defined $Config{d_umask}; + + die 'Calling local_umask() in void context makes no sense' + if ! defined wantarray; + + my $old_umask = umask(shift()); + die "Setting umask failed: $!" unless defined $old_umask; + + return bless \$old_umask, 'DBICTest::Util::UmaskGuard'; +} +{ + package DBICTest::Util::UmaskGuard; + sub DESTROY { + local ($@, $!); + eval { defined (umask ${$_[0]}) or die }; + warn ( "Unable to reset old umask ${$_[0]}: " . ($!||'Unknown error') ) + if ($@ || $!); + } +} sub stacktrace { my $frame = shift; @@ -24,89 +44,4 @@ sub stacktrace { return join "\tinvoked as ", map { sprintf ("%s at %s line %d\n", @$_ ) } @stack; } -my $refs_traced = 0; -sub populate_weakregistry { - my ($reg, $target, $slot) = @_; - - croak 'Target is not a reference' unless defined ref $target; - - $slot ||= (sprintf '%s%s(0x%x)', # so we don't trigger stringification - (defined blessed $target) ? blessed($target) . '=' : '', - reftype $target, - refaddr $target, - ); - - if (defined $reg->{$slot}{weakref}) { - if ( refaddr($reg->{$slot}{weakref}) != (refaddr $target) ) { - print STDERR "Bail out! Weak Registry slot collision: $reg->{$slot}{weakref} / $target\n"; - exit 255; - } - } - else { - $refs_traced++; - weaken( $reg->{$slot}{weakref} = $target ); - $reg->{$slot}{stacktrace} = stacktrace(1); - } - - $target; -} - -my $leaks_found; -sub assert_empty_weakregistry { - my ($weak_registry, $quiet) = @_; - - croak 'Expecting a registry hashref' unless ref $weak_registry eq 'HASH'; - - return unless keys %$weak_registry; - - my $tb = eval { Test::Builder->new } - or croak 'Calling test_weakregistry without a loaded Test::Builder makes no sense'; - - for my $slot (sort keys %$weak_registry) { - next if ! defined $weak_registry->{$slot}{weakref}; - $tb->BAILOUT("!!!! WEAK REGISTRY SLOT $slot IS NOT A WEAKREF !!!!") - unless isweak( $weak_registry->{$slot}{weakref} ); - } - - - for my $slot (sort keys %$weak_registry) { - ! defined $weak_registry->{$slot}{weakref} and next if $quiet; - - $tb->ok (! defined $weak_registry->{$slot}{weakref}, "No leaks of $slot") or do { - $leaks_found = 1; - - my $diag = ''; - - $diag .= Devel::FindRef::track ($weak_registry->{$slot}{weakref}, 20) . "\n" - if ( $ENV{TEST_VERBOSE} && eval { require Devel::FindRef }); - - if (my $stack = $weak_registry->{$slot}{stacktrace}) { - $diag .= " Reference first seen$stack"; - } - - $tb->diag($diag) if $diag; - }; - } -} - -END { - if ($INC{'Test/Builder.pm'}) { - my $tb = Test::Builder->new; - - # we check for test passage - a leak may be a part of a TODO - if ($leaks_found and !$tb->is_passing) { - - $tb->diag(sprintf - "\n\n%s\n%s\n\nInstall Devel::FindRef and re-run the test with set " - . '$ENV{TEST_VERBOSE} (prove -v) to see a more detailed leak-report' - . "\n\n%s\n%s\n\n", ('#' x 16) x 4 - ) if ( !$ENV{TEST_VERBOSE} or !$INC{'Devel/FindRef.pm'} ); - - } - else { - $tb->note("Auto checked $refs_traced references for leaks - none detected"); - } - } -} - 1;