Some cosmetic fixes in ANFANG
[dbsrgits/DBIx-Class.git] / t / 52leaks.t
index 8140113..ae96a21 100644 (file)
@@ -1,3 +1,5 @@
+BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
+
 # work around brain damage in PPerl (yes, it has to be a global)
 $SIG{__WARN__} = sub {
   warn @_ unless $_[0] =~ /\QUse of "goto" to jump into a construct is deprecated/
@@ -21,36 +23,27 @@ use strict;
 use warnings;
 use Test::More;
 
-use lib qw(t/lib);
-use DBICTest::RunMode;
+BEGIN {
+  require DBICTest::Util;
+  plan skip_all => "Your perl version $] appears to leak like a sieve - skipping test"
+    if DBICTest::Util::PEEPEENESS();
+}
 
-plan skip_all => "Temporarily no smoke testing of Test::More 1.3xx alphas" if (
-  DBICTest::RunMode->is_smoker
-    and
-  eval { Test::More->VERSION("1.300") }
-    and
-  require ExtUtils::MakeMaker
-    and
-  MM->parse_version($INC{"Test/Builder.pm"}) =~ / ^ 1 \. 3.. ... \_ /x
-);
+use DBICTest::RunMode;
+use DBICTest::Util::LeakTracer qw(populate_weakregistry assert_empty_weakregistry visit_refs);
+use Scalar::Util qw(weaken blessed reftype);
+use DBIx::Class::_Util qw(hrefaddr sigwarn_silencer modver_gt_or_eq modver_gt_or_eq_and_lt);
+use DBIx::Class::Optional::Dependencies;
 
 my $TB = Test::More->builder;
 if ($ENV{DBICTEST_IN_PERSISTENT_ENV}) {
-  # without this explicit close older TBs warn in END after a ->reset
-  if ($TB->VERSION < 1.005) {
-    close ($TB->$_) for (qw/output failure_output todo_output/);
-  }
-
-  # if I do not do this, I get happy sigpipes on new TB, no idea why
-  # (the above close-and-forget doesn't work - new TB does *not* reopen
-  # its handles automatically anymore)
-  else {
-    for (qw/failure_output todo_output/) {
-      close $TB->$_;
-      open ($TB->$_, '>&', *STDERR);
-    }
+  # without this explicit close TB warns in END after a ->reset
+  close ($TB->$_) for qw(output failure_output todo_output);
 
-    close $TB->output;
+  # newer TB does not auto-reopen handles
+  if ( modver_gt_or_eq( 'Test::More', '1.200' ) ) {
+    open ($TB->$_, '>&', *STDERR)
+      for qw( failure_output todo_output );
     open ($TB->output, '>&', *STDOUT);
   }
 
@@ -58,15 +51,6 @@ if ($ENV{DBICTEST_IN_PERSISTENT_ENV}) {
   $TB->reset;
 }
 
-use DBICTest::Util::LeakTracer qw(populate_weakregistry assert_empty_weakregistry visit_refs);
-use Scalar::Util qw(weaken blessed reftype);
-use DBIx::Class;
-use DBIx::Class::_Util qw(hrefaddr sigwarn_silencer);
-BEGIN {
-  plan skip_all => "Your perl version $] appears to leak like a sieve - skipping test"
-    if DBIx::Class::_ENV_::PEEPEENESS;
-}
-
 # this is what holds all weakened refs to be checked for leakage
 my $weak_registry = {};
 
@@ -74,7 +58,9 @@ my $weak_registry = {};
 my $has_dt;
 
 # Skip the heavy-duty leak tracing when just doing an install
-unless (DBICTest::RunMode->is_plain) {
+# or when having Moose crap all over everything
+# FIXME - remove when Replicated gets off Moose
+if ( !$ENV{DBICTEST_VIA_REPLICATED} and !DBICTest::RunMode->is_plain ) {
 
   # redefine the bless override so that we can catch each and every object created
   no warnings qw/redefine once/;
@@ -98,7 +84,7 @@ unless (DBICTest::RunMode->is_plain) {
     # Test Builder is now making a new object for every pass/fail (que bloat?)
     # and as such we can't really store any of its objects (since it will
     # re-populate the registry while checking it, ewwww!)
-    return $obj if (ref $obj) =~ /^TB2::/;
+    return $obj if (ref $obj) =~ /^TB2::|^Test::Stream/;
 
     # populate immediately to avoid weird side effects
     return populate_weakregistry ($weak_registry, $obj );
@@ -117,13 +103,12 @@ unless (DBICTest::RunMode->is_plain) {
   # Load them and empty the registry
 
   # this loads the DT armada
-  $has_dt = DBIx::Class::Optional::Dependencies->req_ok_for([qw( test_rdbms_sqlite icdt )]);
+  $has_dt = DBIx::Class::Optional::Dependencies->req_ok_for([qw( test_rdbms_sqlite ic_dt )]);
 
-  require Errno;
   require DBI;
   require DBD::SQLite;
-  require FileHandle;
   require Moo;
+  require Math::BigInt;
 
   %$weak_registry = ();
 }
@@ -135,8 +120,6 @@ unless (DBICTest::RunMode->is_plain) {
   my $rs = $schema->resultset ('Artist');
   my $storage = $schema->storage;
 
-  ok ($storage->connected, 'we are connected');
-
   my $row_obj = $rs->search({}, { rows => 1})->next;  # so that commits/rollbacks work
   ok ($row_obj, 'row from db');
 
@@ -461,11 +444,23 @@ for my $addr (keys %$weak_registry) {
     # T::B 2.0 has result objects and other fancyness
     delete $weak_registry->{$addr};
   }
+  # remove this when IO::Dir is gone from SQLT
+  elsif ($INC{"IO/Dir.pm"} and $names =~ /^Class::Struct::Tie_ISA/m) {
+    delete $weak_registry->{$addr};
+  }
   elsif ($names =~ /^Hash::Merge/m) {
     # only clear one object of a specific behavior - more would indicate trouble
     delete $weak_registry->{$addr}
       unless $cleared->{hash_merge_singleton}{$weak_registry->{$addr}{weakref}{behavior}}++;
   }
+  elsif ($names =~ /^B::Hooks::EndOfScope::PP::_TieHintHashFieldHash/m) {
+    # there is one tied lexical which stays alive until GC time
+    # https://metacpan.org/source/ETHER/B-Hooks-EndOfScope-0.15/lib/B/Hooks/EndOfScope/PP/FieldHash.pm#L24
+    # simply ignore it here, instead of teaching the leaktracer to examine ties
+    # the latter is possible yet terrible: https://github.com/dbsrgits/dbix-class/blob/v0.082820/t/lib/DBICTest/Util/LeakTracer.pm#L113-L117
+    delete $weak_registry->{$addr}
+      unless $cleared->{bheos_pptiehinthashfieldhash}++;
+  }
   elsif ($names =~ /^DateTime::TimeZone::UTC/m) {
     # DT is going through a refactor it seems - let it leak zones for now
     delete $weak_registry->{$addr};
@@ -531,12 +526,6 @@ assert_empty_weakregistry ($weak_registry);
 # this is ugly and dirty but we do not yet have a Test::Embedded or
 # similar
 
-# set up -I
-require Config;
-$ENV{PERL5LIB} = join ($Config::Config{path_sep}, @INC);
-($ENV{PATH}) = $ENV{PATH} =~ /(.+)/;
-
-
 my $persistence_tests;
 SKIP: {
   skip 'Test already in a persistent loop', 1
@@ -545,7 +534,13 @@ SKIP: {
   skip 'Main test failed - skipping persistent env tests', 1
     unless $TB->is_passing;
 
+  skip "Test::Builder\@@{[ Test::Builder->VERSION ]} known to break persistence tests", 1
+    if modver_gt_or_eq_and_lt( 'Test::More', '1.200', '1.301001_099' );
+
   local $ENV{DBICTEST_IN_PERSISTENT_ENV} = 1;
+  local $ENV{DBICTEST_ANFANG_DEFANG} = 1;
+
+  require File::Spec;
 
   $persistence_tests = {
     PPerl => {
@@ -564,7 +559,17 @@ SKIP: {
     @{$persistence_tests->{PPerl}{cmd}}[ 1 .. $#{$persistence_tests->{PPerl}{cmd}} ],
   ];
 
-  require IPC::Open2;
+  # set up -I
+  require Config;
+  $ENV{PERL5LIB} = join ($Config::Config{path_sep}, @INC);
+
+  # adjust PATH for -T
+  if (length $ENV{PATH}) {
+    ( $ENV{PATH} ) = join ( $Config::Config{path_sep},
+      map { length($_) ? File::Spec->rel2abs($_) : () }
+        split /\Q$Config::Config{path_sep}/, $ENV{PATH}
+    ) =~ /\A(.+)\z/;
+  }
 
   for my $type (keys %$persistence_tests) { SKIP: {
     unless (eval "require $type") {
@@ -586,6 +591,8 @@ SKIP: {
         if system(@cmd);
     }
 
+    require IPC::Open2;
+
     for (1,2,3) {
       note ("Starting run in persistent env ($type pass $_)");
       IPC::Open2::open2(my $out, undef, @cmd);