X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Ftxn_scope_guard.t;h=2df2ab6156d470f90a692ce01cd5241dd4b6fa8b;hb=35cf7d1af;hp=03985b3daf903bffec878db8caf2f3d74f57a7b4;hpb=87bf71d54c0e5bd50700d8e3be59b79e9b670012;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/txn_scope_guard.t b/t/storage/txn_scope_guard.t index 03985b3..2df2ab6 100644 --- a/t/storage/txn_scope_guard.t +++ b/t/storage/txn_scope_guard.t @@ -24,7 +24,7 @@ use DBICTest; }); $guard->commit; - } qr/No such column made_up_column .*? at .*?\Q$fn\E line \d+/s, "Error propogated okay"; + } qr/No such column 'made_up_column' .*? at .*?\Q$fn\E line \d+/s, "Error propogated okay"; ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created"); @@ -106,7 +106,7 @@ use DBICTest; #$schema->storage->_dbh( $schema->storage->_dbh->clone ); die 'Deliberate exception'; - }, ($] >= 5.013008 ) + }, ( "$]" >= 5.013008 ) ? qr/Deliberate exception/s # temporary until we get the generic exception wrapper rolling : qr/Deliberate exception.+Rollback failed/s ); @@ -116,8 +116,11 @@ use DBICTest; } # make sure it warns *big* on failed rollbacks -{ - my $schema = DBICTest->init_schema(); +# test with and without a poisoned $@ +for my $pre_poison (0,1) { +for my $post_poison (0,1) { + + my $schema = DBICTest->init_schema(no_populate => 1); no strict 'refs'; no warnings 'redefine'; @@ -159,15 +162,85 @@ use DBICTest; warn $_[0]; } }; + { - my $guard = $schema->txn_scope_guard; - $schema->resultset ('Artist')->create ({ name => 'bohhoo'}); + eval { die 'pre-GIFT!' if $pre_poison }; + my $guard = $schema->txn_scope_guard; + eval { die 'post-GIFT!' if $post_poison }; + $schema->resultset ('Artist')->create ({ name => 'bohhoo'}); } - is (@w, 2, 'Both expected warnings found'); + local $TODO = 'Do not know how to deal with trapped exceptions occuring after guard instantiation...' + if ( $post_poison and ( + # take no chances on installation + DBICTest::RunMode->is_plain + or + # this always fails + ! $pre_poison + or + # I do not understand why but on <= 5.8.8 and on 5.10.0 "$pre_poison && $post_poison" passes... + ( "$]" > 5.008008 and "$]" < 5.010000 ) or "$]" > 5.010000 + )); + + is (@w, 2, "Both expected warnings found - \$\@ pre-poison: $pre_poison, post-poison: $post_poison" ); # just to mask off warning since we could not disconnect above $schema->storage->_dbh->disconnect; +}} + +# add a TODO to catch when Text::Balanced is finally fixed +# https://rt.cpan.org/Public/Bug/Display.html?id=74994 +# +# while it doesn't matter much for DBIC itself, this particular bug +# is a *BANE*, and DBIC is to bump its dep as soon as possible +{ + + require Text::Balanced; + + my @w; + local $SIG{__WARN__} = sub { + $_[0] =~ /External exception class .+? \Qimplements partial (broken) overloading/ + ? push @w, @_ + : warn @_ + }; + + lives_ok { + # this is what poisons $@ + Text::Balanced::extract_bracketed( '(foo', '()' ); + DBIx::Class::_Util::is_exception($@); + + my $s = DBICTest::Schema->connect('dbi:SQLite::memory:'); + my $g = $s->txn_scope_guard; + $g->commit; + } 'Broken Text::Balanced is not screwing up txn_guard'; + + local $TODO = 'RT#74994 *STILL* not fixed'; + is(scalar @w, 0, 'no warnings \o/'); +} + +# ensure Devel::StackTrace-refcapture-like effects are countered +{ + my $s = DBICTest::Schema->connect('dbi:SQLite::memory:'); + my $g = $s->txn_scope_guard; + + my @arg_capture; + { + local $SIG{__WARN__} = sub { + package DB; + my $frnum; + while (my @f = CORE::caller(++$frnum) ) { + push @arg_capture, @DB::args; + } + }; + + undef $g; + 1; + } + + warnings_exist + { @arg_capture = () } + qr/\QPreventing *MULTIPLE* DESTROY() invocations on DBIx::Class::Storage::TxnScopeGuard/ + ; } done_testing;