X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F52leaks.t;h=4f75810005188586a381d5d79f29b616376fc0d8;hb=35f5c265f7114c98663ac471e54b4ea9e34b3f37;hp=f044db56cf3693f6fb1f3e5e04179d6acecd6dd7;hpb=f05edfd131226876096103089d62a775dd3c99ba;p=dbsrgits%2FDBIx-Class.git diff --git a/t/52leaks.t b/t/52leaks.t index f044db5..4f75810 100644 --- a/t/52leaks.t +++ b/t/52leaks.t @@ -12,12 +12,17 @@ BEGIN { } use Test::More; -use Scalar::Util qw/refaddr reftype weaken/; -use Carp qw/longmess/; -use Try::Tiny; use lib qw(t/lib); use DBICTest::RunMode; +BEGIN { + plan skip_all => "Your perl version $] appears to leak like a sieve - skipping test" + if DBICTest::RunMode->peepeeness; +} + +use Scalar::Util qw/refaddr reftype weaken/; +use Carp qw/longmess/; +use Try::Tiny; my $have_test_cycle; BEGIN { @@ -39,6 +44,7 @@ unless (DBICTest::RunMode->is_plain) { require Errno; require Class::Struct; require FileHandle; + require Hash::Merge; no warnings qw/redefine once/; no strict qw/refs/; @@ -91,9 +97,10 @@ unless (DBICTest::RunMode->is_plain) { ok ($storage->connected, 'we are connected'); - my $row_obj = $rs->next; + my $row_obj = $rs->search({}, { rows => 1})->next; # so that commits/rollbacks work ok ($row_obj, 'row from db'); + # txn_do to invoke more codepaths my ($mc_row_obj, $pager, $pager_explicit_count) = $schema->txn_do (sub { my $artist = $rs->create ({ @@ -116,11 +123,35 @@ unless (DBICTest::RunMode->is_plain) { # based on 66 per 10 pages is ($pager_explicit_count->last_page, 7, 'Correct last page'); + # do some population (invokes some extra codepaths) + # also exercise the guard code and the manual txn control + { + my $guard = $schema->txn_scope_guard; + # populate with bindvars + $rs->populate([{ name => 'James Bound' }]); + $guard->commit; + + $schema->txn_begin; + # populate mixed + $rs->populate([{ name => 'James Rebound', rank => \ '11' }]); + $schema->txn_commit; + + $schema->txn_begin; + # and without bindvars + $rs->populate([{ name => \ '"James Unbound"' }]); + $schema->txn_rollback; + } + my $base_collection = { schema => $schema, storage => $storage, resultset => $rs, + + # twice so that we make sure only one H::M object spawned + chained_resultset => $rs->search_rs ({}, { '+columns' => [ 'foo' ] } ), + chained_resultset2 => $rs->search_rs ({}, { '+columns' => [ 'bar' ] } ), + row_object => $row_obj, result_source => $rs->result_source, @@ -146,6 +177,29 @@ unless (DBICTest::RunMode->is_plain) { memory_cycle_ok($weak_registry, 'No cycles in the weakened object collection') if $have_test_cycle; +# Naturally we have some exceptions +my $cleared; +for my $slot (keys %$weak_registry) { + if ($slot =~ /^\QTest::Builder/) { + # T::B 2.0 has result objects and other fancyness + delete $weak_registry->{$slot}; + } + elsif ($slot =~ /^\QSQL::Translator/) { + # SQLT is a piece of shit, leaks all over + delete $weak_registry->{$slot}; + } + elsif ($slot =~ /^\QHash::Merge/) { + # only clear one object of a specific behavior - more would indicate trouble + delete $weak_registry->{$slot} + unless $cleared->{hash_merge_singleton}{$weak_registry->{$slot}{weakref}{behavior}}++; + } + elsif ($slot =~ /^__TxnScopeGuard__FIXUP__/) { + die 'The $@ debacle should have been fixed by now!!!' if $] >= 5.013008; + delete $weak_registry->{$slot}; + } +} + + # FIXME # For reasons I can not yet fully understand the table() god-method (located in # ::ResultSourceProxy::Table) attaches an actual source instance to each class @@ -164,8 +218,6 @@ DBICTest::Schema->source_registrations(undef); my $tb = Test::More->builder; for my $slot (keys %$weak_registry) { - # SQLT is a piece of shit, leaks all over - next if $slot =~ /^SQL\:\:Translator/; ok (! defined $weak_registry->{$slot}{weakref}, "No leaks of $slot") or do { my $diag = '';