Pedantry - settle on rel_name vs relname, consistency throughout
[dbsrgits/DBIx-Class.git] / t / lib / DBICTest / Util.pm
index b120acd..b821243 100644 (file)
@@ -3,11 +3,33 @@ package DBICTest::Util;
 use warnings;
 use strict;
 
-use Carp;
-use Scalar::Util qw/isweak weaken blessed reftype refaddr/;
+use Config;
+use Carp 'confess';
+use Scalar::Util qw(blessed refaddr);
 
 use base 'Exporter';
-our @EXPORT_OK = qw/stacktrace populate_weakregistry assert_empty_weakregistry/;
+our @EXPORT_OK = qw(local_umask stacktrace check_customcond_args);
+
+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,71 +46,37 @@ sub stacktrace {
   return join "\tinvoked as ", map { sprintf ("%s at %s line %d\n", @$_ ) } @stack;
 }
 
-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,
-  );
-
-  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';
+sub check_customcond_args ($) {
+  my $args = shift;
 
-  return unless keys %$weak_registry;
+  confess "Expecting a hashref"
+    unless ref $args eq 'HASH';
 
-  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 (qw(rel_name foreign_relname self_alias foreign_alias)) {
+    confess "Custom condition argument '$_' must be a plain string"
+      if length ref $args->{$_} or ! length $args->{$_};
   }
 
+  confess "Current and legacy rel_name arguments do not match"
+    if $args->{rel_name} ne $args->{foreign_relname};
 
-  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 = '';
+  confess "Custom condition argument 'self_resultsource' must be a rsrc instance"
+    unless defined blessed $args->{self_resultsource} and $args->{self_resultsource}->isa('DBIx::Class::ResultSource');
 
-      $diag .= Devel::FindRef::track ($weak_registry->{$slot}{weakref}, 20) . "\n"
-        if ( $ENV{TEST_VERBOSE} && eval { require Devel::FindRef });
+  confess "Passed resultsource has no record of the supplied rel_name - likely wrong \$rsrc"
+    unless ref $args->{self_resultsource}->relationship_info($args->{rel_name});
 
-      if (my $stack = $weak_registry->{$slot}{stacktrace}) {
-        $diag .= "    Reference first seen$stack";
-      }
+  if (defined $args->{self_resultobj} or defined $args->{self_rowobj} ) {
+    for (qw(self_resultobj self_rowobj)) {
+      confess "Custom condition argument '$_' must be a result instance"
+        unless defined blessed $args->{$_} and $args->{$_}->isa('DBIx::Class::Row');
+    }
 
-      $tb->diag($diag) if $diag;
-    };
+    confess "Current and legacy self_resultobj arguments do not match"
+      if refaddr($args->{self_resultobj}) != refaddr($args->{self_rowobj});
   }
-}
 
-END {
-  if ($leaks_found) {
-    my $tb = Test::Builder->new;
-    $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 (!$tb->is_passing and (!$ENV{TEST_VERBOSE} or !$INC{'Devel/FindRef.pm'}));
-  }
+  $args;
 }
 
 1;