Skip to content

Commit

Permalink
Make both pg and mysql execute t/98savepoints.t if present
Browse files Browse the repository at this point in the history
  • Loading branch information
ribasushi committed Nov 25, 2011
1 parent 09d763c commit ae1d3ea
Showing 1 changed file with 110 additions and 103 deletions.
213 changes: 110 additions & 103 deletions t/98savepoints.t
Expand Up @@ -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)');
Expand All @@ -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 }

0 comments on commit ae1d3ea

Please sign in to comment.