X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Freconnect.t;h=4fa8384bf07f039f01195e8b9941d75e3c0bd6c1;hb=729656c504e5ca25cfebfbbbce69bb1e74268ef6;hp=557bff8cab086fd0be7618bda41561b90b2103b1;hpb=9fca7edaab553843d898e3acbd8c6b1f59602e3a;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/reconnect.t b/t/storage/reconnect.t index 557bff8..4fa8384 100644 --- a/t/storage/reconnect.t +++ b/t/storage/reconnect.t @@ -2,7 +2,9 @@ use strict; use warnings; use FindBin; +use B::Deparse; use File::Copy 'move'; +use Scalar::Util 'weaken'; use Test::More; use Test::Exception; use lib qw(t/lib); @@ -49,7 +51,7 @@ close $db_file; # Catch the DBI connection error local $SIG{__WARN__} = sub {}; throws_ok { - my @art_three = $schema->resultset("Artist")->search( {}, { order_by => { -desc => 'name' } } ); + $schema->resultset("Artist")->create({ name => 'not gonna happen' }); } qr/not a database/, 'The operation failed'; } @@ -106,4 +108,65 @@ for my $ctx (keys %$ctx_map) { } }; +# make sure RT#110429 does not recur on manual DBI-side disconnect +for my $cref ( + sub { + my $schema = shift; + + my $g = $schema->txn_scope_guard; + + is( $schema->storage->transaction_depth, 1, "Expected txn depth" ); + + $schema->storage->_dbh->disconnect; + + $schema->storage->dbh_do(sub { $_[1]->do('SELECT 1') } ); + }, + sub { + my $schema = shift; + $schema->txn_do(sub { + $schema->storage->_dbh->disconnect + } ); + }, + sub { + my $schema = shift; + $schema->txn_do(sub { + $schema->storage->disconnect; + die "VIOLENCE"; + } ); + }, +) { + + note( "Testing with " . B::Deparse->new->coderef2text($cref) ); + + $schema->storage->disconnect; + + ok( !$schema->storage->connected, 'Not connected' ); + + is( $schema->storage->transaction_depth, undef, "Start with unknown txn depth" ); + + # messages vary depending on version and whether txn or do, whatever + dies_ok { + $cref->($schema) + } 'Threw *something*'; + + ok( !$schema->storage->connected, 'Not connected as a result of failed rollback' ); + + is( $schema->storage->transaction_depth, undef, "Depth expectedly unknown after failed rollbacks" ); +} + +# check that things aren't crazy with a non-violent disconnect +{ + my $schema = DBICTest->init_schema( sqlite_use_file => 0, no_deploy => 1 ); + weaken( my $ws = $schema ); + + $schema->is_executed_sql_bind( sub { + $ws->txn_do(sub { $ws->storage->disconnect } ); + }, [ [ 'BEGIN' ] ], 'Only one BEGIN statement' ); + + $schema->is_executed_sql_bind( sub { + my $g = $ws->txn_scope_guard; + $ws->storage->disconnect; + }, [ [ 'BEGIN' ] ], 'Only one BEGIN statement' ); +} + done_testing;