X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Fsavepoints.t;h=8960a5e5ed38597cf36aa2f4c4b2bc5bbeea64e9;hb=6b44e3b08d4d855e971ccb756fc2038a7cb206cb;hp=613eb14beeddcaa7ca60ac49c2def36dd83437fa;hpb=2c2bc4e58c2146670960fc1a0a2ae802cb650506;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/savepoints.t b/t/storage/savepoints.t index 613eb14..8960a5e 100644 --- a/t/storage/savepoints.t +++ b/t/storage/savepoints.t @@ -1,10 +1,14 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; use Test::More; use Test::Exception; +use DBIx::Class::Optional::Dependencies; +use DBIx::Class::_Util qw(sigwarn_silencer scope_guard); +use Scalar::Util 'weaken'; -use lib qw(t/lib); use DBICTest; { @@ -34,15 +38,12 @@ for ('', keys %$env2optdep) { SKIP: { my $prefix; if ($prefix = $_) { - my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/; - skip ("Skipping tests with $prefix: set \$ENV{${prefix}_DSN} _USER and _PASS", 1) - unless $dsn; + DBIx::Class::Optional::Dependencies->skip_without($env2optdep->{$prefix}); - skip ("Testing with ${prefix}_DSN needs " . DBIx::Class::Optional::Dependencies->req_missing_for( $env2optdep->{$prefix} ), 1) - unless DBIx::Class::Optional::Dependencies->req_ok_for($env2optdep->{$prefix}); + my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/; - $schema = DBICTest->connect_schema ($dsn,$user,$pass,{ auto_savepoint => 1 }); + $schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 }); my $create_sql; $schema->storage->ensure_connected; @@ -69,8 +70,17 @@ for ('', keys %$env2optdep) { SKIP: { note "Testing $prefix"; - local $schema->storage->{debugobj} = my $stats = DBICTest::SVPTracerObj->new; - local $schema->storage->{debug} = 1; + # can not use local() due to an unknown number of storages + # (think replicated) + my $orig_states = { map + { $_ => $schema->storage->$_ } + qw(debugcb debugobj debug) + }; + my $sg = scope_guard { + $schema->storage->$_ ( $orig_states->{$_} ) for keys %$orig_states; + }; + $schema->storage->debugobj (my $stats = DBICTest::SVPTracerObj->new); + $schema->storage->debug (1); $schema->resultset('Artist')->create({ name => 'foo' }); @@ -228,15 +238,27 @@ for ('', keys %$env2optdep) { SKIP: { undef, 'rollback from inner transaction'; + # make sure a fresh txn will work after above + $schema->storage->txn_do(sub { ok "noop" } ); + +### Make sure non-existend savepoint release doesn't infloop itself + { + weaken( my $s = $schema ); + + throws_ok { + $s->storage->txn_do(sub { $s->svp_release('wibble') }) + } qr/Savepoint 'wibble' does not exist/, + "Calling svp_release on a non-existant savepoint throws expected error" + ; + } + ### cleanupz - $schema->storage->dbh->do ("DROP TABLE artist"); + $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") }); }} done_testing; -# XXX: The leak tests fail if this is END compiled before (and thus -# executed after) the one in DBICTest::BaseSchema END { - eval { $schema->storage->dbh->do ("DROP TABLE artist") } if defined $schema; + eval { $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") }) } if defined $schema; undef $schema; }