From: Peter Rabbitson Date: Fri, 25 Nov 2011 23:20:16 +0000 (+0100) Subject: Make both pg and mysql execute t/98savepoints.t if present X-Git-Tag: v0.08196~6 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=ae1d3ea19c3cb0c012ff099f8c10ff4127c5c57e Make both pg and mysql execute t/98savepoints.t if present --- diff --git a/t/98savepoints.t b/t/98savepoints.t index 7bc6d64..03365ec 100644 --- a/t/98savepoints.t +++ b/t/98savepoints.t @@ -4,142 +4,144 @@ use warnings; use Test::More; use DBIx::Class::Optional::Dependencies (); -my ($create_sql, $dsn, $user, $pass); +my $env2optdep = { + DBICTEST_PG => 'rdbms_pg', + DBICTEST_MYSQL => 'test_rdbms_mysql', +}; -if ($ENV{DBICTEST_PG_DSN}) { - plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('rdbms_pg') - unless DBIx::Class::Optional::Dependencies->req_ok_for ('rdbms_pg'); - - ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/}; - - $create_sql = "CREATE TABLE artist (artistid serial PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10))"; -} elsif ($ENV{DBICTEST_MYSQL_DSN}) { - plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_mysql') - unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_mysql'); - - ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; - - $create_sql = "CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10)) ENGINE=InnoDB"; -} else { - plan skip_all => 'Set DBICTEST_(PG|MYSQL)_DSN _USER and _PASS if you want to run savepoint tests'; -} +plan skip_all => join (' ', + 'Set $ENV{DBICTEST_PG_DSN} and/or $ENV{DBICTEST_MYSQL_DSN} _USER and _PASS to run these tests.', +) unless grep { $ENV{"${_}_DSN"} } keys %$env2optdep; use lib qw(t/lib); use DBICTest; use DBICTest::Stats; -plan tests => 16; +my $schema; -my $schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 }); +for my $prefix (keys %$env2optdep) { SKIP: { + my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/; -my $stats = DBICTest::Stats->new; + skip ("Skipping tests with $prefix: set \$ENV{${prefix}_DSN} _USER and _PASS", 1) + unless $dsn; -$schema->storage->debugobj($stats); + 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}); -$schema->storage->debug(1); + $schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 }); -{ - local $SIG{__WARN__} = sub {}; - $schema->storage->dbh->do ('DROP TABLE IF EXISTS artist'); - $schema->storage->dbh->do ($create_sql); -} + my $create_sql; + $schema->storage->ensure_connected; + if ($schema->storage->isa('DBIx::Class::Storage::DBI::Pg')) { + $create_sql = "CREATE TABLE artist (artistid serial PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10))"; + $schema->storage->dbh->do('SET client_min_messages=WARNING'); + } + elsif ($schema->storage->isa('DBIx::Class::Storage::DBI::mysql')) { + $create_sql = "CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10)) ENGINE=InnoDB"; + } + else { + skip( 'Untested driver ' . $schema->storage, 1 ); + } -$schema->resultset('Artist')->create({ name => 'foo' }); + note "Testing $prefix"; -$schema->txn_begin; + my $stats = DBICTest::Stats->new; + $schema->storage->debugobj($stats); + $schema->storage->debug(1); -my $arty = $schema->resultset('Artist')->find(1); + $schema->storage->dbh->do ('DROP TABLE IF EXISTS artist'); + $schema->storage->dbh->do ($create_sql); -my $name = $arty->name; + $schema->resultset('Artist')->create({ name => 'foo' }); -# First off, test a generated savepoint name -$schema->svp_begin; + $schema->txn_begin; -cmp_ok($stats->{'SVP_BEGIN'}, '==', 1, 'Statistics svp_begin tickled'); + my $arty = $schema->resultset('Artist')->find(1); -$arty->update({ name => 'Jheephizzy' }); + my $name = $arty->name; -$arty->discard_changes; + # First off, test a generated savepoint name + $schema->svp_begin; -cmp_ok($arty->name, 'eq', 'Jheephizzy', 'Name changed'); + cmp_ok($stats->{'SVP_BEGIN'}, '==', 1, 'Statistics svp_begin tickled'); -# Rollback the generated name -# Active: 0 -$schema->svp_rollback; + $arty->update({ name => 'Jheephizzy' }); -cmp_ok($stats->{'SVP_ROLLBACK'}, '==', 1, 'Statistics svp_rollback tickled'); + $arty->discard_changes; -$arty->discard_changes; + cmp_ok($arty->name, 'eq', 'Jheephizzy', 'Name changed'); -cmp_ok($arty->name, 'eq', $name, 'Name rolled back'); + # Rollback the generated name + # Active: 0 + $schema->svp_rollback; -$arty->update({ name => 'Jheephizzy'}); + cmp_ok($stats->{'SVP_ROLLBACK'}, '==', 1, 'Statistics svp_rollback tickled'); -# Active: 0 1 -$schema->svp_begin('testing1'); + $arty->discard_changes; -$arty->update({ name => 'yourmom' }); + cmp_ok($arty->name, 'eq', $name, 'Name rolled back'); -# Active: 0 1 2 -$schema->svp_begin('testing2'); + $arty->update({ name => 'Jheephizzy'}); -$arty->update({ name => 'gphat' }); -$arty->discard_changes; -cmp_ok($arty->name, 'eq', 'gphat', 'name changed'); -# Active: 0 1 2 -# Rollback doesn't DESTROY the savepoint, it just rolls back to the value -# at it's conception -$schema->svp_rollback('testing2'); -$arty->discard_changes; -cmp_ok($arty->name, 'eq', 'yourmom', 'testing2 reverted'); + # Active: 0 1 + $schema->svp_begin('testing1'); -# Active: 0 1 2 3 -$schema->svp_begin('testing3'); -$arty->update({ name => 'coryg' }); -# Active: 0 1 2 3 4 -$schema->svp_begin('testing4'); -$arty->update({ name => 'watson' }); + $arty->update({ name => 'yourmom' }); -# Release 3, which implicitly releases 4 -# Active: 0 1 2 -$schema->svp_release('testing3'); -$arty->discard_changes; -cmp_ok($arty->name, 'eq', 'watson', 'release left data'); -# This rolls back savepoint 2 -# Active: 0 1 2 -$schema->svp_rollback; -$arty->discard_changes; -cmp_ok($arty->name, 'eq', 'yourmom', 'rolled back to 2'); + # Active: 0 1 2 + $schema->svp_begin('testing2'); -# Rollback the original savepoint, taking us back to the beginning, implicitly -# rolling back savepoint 1 and 2 -$schema->svp_rollback('savepoint_0'); -$arty->discard_changes; -cmp_ok($arty->name, 'eq', 'foo', 'rolled back to start'); + $arty->update({ name => 'gphat' }); + $arty->discard_changes; + cmp_ok($arty->name, 'eq', 'gphat', 'name changed'); + # Active: 0 1 2 + # Rollback doesn't DESTROY the savepoint, it just rolls back to the value + # at it's conception + $schema->svp_rollback('testing2'); + $arty->discard_changes; + cmp_ok($arty->name, 'eq', 'yourmom', 'testing2 reverted'); -$schema->txn_commit; + # Active: 0 1 2 3 + $schema->svp_begin('testing3'); + $arty->update({ name => 'coryg' }); + # Active: 0 1 2 3 4 + $schema->svp_begin('testing4'); + $arty->update({ name => 'watson' }); -# And now to see if txn_do will behave correctly + # Release 3, which implicitly releases 4 + # Active: 0 1 2 + $schema->svp_release('testing3'); + $arty->discard_changes; + cmp_ok($arty->name, 'eq', 'watson', 'release left data'); + # This rolls back savepoint 2 + # Active: 0 1 2 + $schema->svp_rollback; + $arty->discard_changes; + cmp_ok($arty->name, 'eq', 'yourmom', 'rolled back to 2'); -$schema->txn_do (sub { - $schema->txn_do (sub { - $arty->name ('Muff'); + # Rollback the original savepoint, taking us back to the beginning, implicitly + # rolling back savepoint 1 and 2 + $schema->svp_rollback('savepoint_0'); + $arty->discard_changes; + cmp_ok($arty->name, 'eq', 'foo', 'rolled back to start'); - $arty->update; - }); + $schema->txn_commit; + + # And now to see if txn_do will behave correctly + $schema->txn_do (sub { + $schema->txn_do (sub { + $arty->name ('Muff'); + $arty->update; + }); eval { $schema->txn_do (sub { - $arty->name ('Moff'); - - $arty->update; - - $arty->discard_changes; - - is($arty->name,'Moff','Value updated in nested transaction'); - - $schema->storage->dbh->do ("GUARANTEED TO PHAIL"); - }); + $arty->name ('Moff'); + $arty->update; + $arty->discard_changes; + is($arty->name,'Moff','Value updated in nested transaction'); + $schema->storage->dbh->do ("GUARANTEED TO PHAIL"); + }); }; ok ($@,'Nested transaction failed (good)'); @@ -153,15 +155,20 @@ $schema->txn_do (sub { $arty->update; }); -$arty->discard_changes; + $arty->discard_changes; + + is($arty->name,'Miff','auto_savepoint worked'); + + cmp_ok($stats->{'SVP_BEGIN'},'==',7,'Correct number of savepoints created'); -is($arty->name,'Miff','auto_savepoint worked'); + cmp_ok($stats->{'SVP_RELEASE'},'==',3,'Correct number of savepoints released'); -cmp_ok($stats->{'SVP_BEGIN'},'==',7,'Correct number of savepoints created'); + cmp_ok($stats->{'SVP_ROLLBACK'},'==',5,'Correct number of savepoint rollbacks'); -cmp_ok($stats->{'SVP_RELEASE'},'==',3,'Correct number of savepoints released'); + $schema->storage->dbh->do ("DROP TABLE artist"); +}} -cmp_ok($stats->{'SVP_ROLLBACK'},'==',5,'Correct number of savepoint rollbacks'); +done_testing; -END { $schema->storage->dbh->do ("DROP TABLE artist") if defined $schema } +END { eval { $schema->storage->dbh->do ("DROP TABLE artist") } if defined $schema }