First basic tests. Reset global var. Add post_pipeline to PercoaTest::no_diff().

This commit is contained in:
Daniel Nichter
2011-09-29 17:54:38 -06:00
parent 72d71a84da
commit b3cfd659b1
5 changed files with 168 additions and 78 deletions

View File

@@ -5216,11 +5216,14 @@ $Data::Dumper::Quotekeys = 0;
use sigtrap 'handler', \&sig_int, 'normal-signals'; use sigtrap 'handler', \&sig_int, 'normal-signals';
my $oktorun = 1; my $oktorun = 1;
my $print_header = 1; # print headers once
sub main { sub main {
@ARGV = @_; # set global ARGV for this package # Reset global vars else tests will fail in strange ways.
@ARGV = @_;
$oktorun = 1;
$print_header = 1;
$oktorun = 1; # global, must reset else tests will fail
my $exit_status = 0; my $exit_status = 0;
# ######################################################################## # ########################################################################
@@ -5980,7 +5983,6 @@ sub exec_nibble {
{ {
my $line_fmt = "%14s %6s %6s %7s %7s %7s %7s %-s\n"; my $line_fmt = "%14s %6s %6s %7s %7s %7s %7s %-s\n";
my @headers = qw(TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE); my @headers = qw(TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE);
my $print_header = 1; # print headers once
sub print_checksum_results { sub print_checksum_results {
my (%args) = @_; my (%args) = @_;
@@ -6816,7 +6818,9 @@ should be printed, in percentage, seconds, or number of iterations.
Don't print anything to STDOUT. Don't print anything to STDOUT.
=item --recheck =item --[no]recheck
default: yes
Re-checksum chunks that L<"--replicate-check"> found to be different. Re-checksum chunks that L<"--replicate-check"> found to be different.

View File

@@ -492,6 +492,10 @@ sub no_diff {
if ( my $trf = $args{trf} ) { if ( my $trf = $args{trf} ) {
`$trf $tmp_file_orig > $tmp_file`; `$trf $tmp_file_orig > $tmp_file`;
} }
if ( my $post_pipe = $args{post_pipe} ) {
`cat $tmp_file | $post_pipe > $tmp_file-2`;
`mv $tmp_file-2 $tmp_file`;
}
if ( my $sed_args = $args{sed} ) { if ( my $sed_args = $args{sed} ) {
foreach my $sed_args ( @{$args{sed}} ) { foreach my $sed_args ( @{$args{sed}} ) {
`cat $tmp_file | sed $sed_args > $tmp_file-2`; `cat $tmp_file | sed $sed_args > $tmp_file-2`;

View File

@@ -11,6 +11,7 @@ use warnings FATAL => 'all';
use English qw(-no_match_vars); use English qw(-no_match_vars);
use Test::More; use Test::More;
use Data::Dumper;
use PerconaTest; use PerconaTest;
use Sandbox; use Sandbox;
require "$trunk/bin/pt-table-checksum"; require "$trunk/bin/pt-table-checksum";
@@ -18,34 +19,34 @@ require "$trunk/bin/pt-table-checksum";
my $dp = new DSNParser(opts=>$dsn_opts); my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $master_dbh = $sb->get_dbh_for('master'); my $master_dbh = $sb->get_dbh_for('master');
my $slave_dbh = $sb->get_dbh_for('slave1');
if ( !$master_dbh ) { if ( !$master_dbh ) {
plan skip_all => 'Cannot connect to sandbox master'; plan skip_all => 'Cannot connect to sandbox master';
} }
elsif ( !$slave_dbh ) {
plan skip_all => 'Cannot connect to sandbox slave1';
}
elsif ( !@{$master_dbh->selectall_arrayref('show databases like "sakila"')} ) {
plan skip_all => 'sakila database is not loaded';
}
else { else {
plan tests => 10; plan tests => 4;
} }
my $row;
my ($output, $output2);
my $cnf = '/tmp/12345/my.sandbox.cnf'; my $cnf = '/tmp/12345/my.sandbox.cnf';
my @args = ('-F', $cnf, qw(-d test -t checksum_test 127.0.0.1 --replicate test.checksum)); my $dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
$sb->create_dbs($master_dbh, [qw(test)]); my $row;
$sb->load_file('master', 't/pt-table-checksum/samples/replicate.sql'); my $output;
my $sample = "t/pt-table-checksum/samples/";
my $outfile = '/tmp/pt-table-checksum-results';
my $repl_db = 'percona';
sub empty_repl_tbl { sub reset_repl_db {
$master_dbh->do('truncate table test.checksum'); $master_dbh->do("drop database if exists $repl_db");
wait_until( $master_dbh->do("create database $repl_db");
sub { $master_dbh->do("use $repl_db");
my @rows;
eval {
@rows = $master_dbh->selectall_array("select * from test.checksum");
};
return 1 if @rows == 0;
},
);
ok(1, "Empty checksum table");
} }
sub set_tx_isolation { sub set_tx_isolation {
@@ -77,77 +78,82 @@ sub set_binlog_format {
); );
} }
# ############################################################################# reset_repl_db();
# Test that --replicate disables --lock, --wait and --slave-lag like the diag(`rm $outfile >/dev/null 2>&1`);
# docu says. Once it didn't and that lead to issue 51.
# #############################################################################
my $cmd = "$trunk/bin/pt-table-checksum";
$output = `$cmd localhost --replicate test.checksum --help --wait 5`; # ############################################################################
like( # Default checksum, results
$output, # ############################################################################
qr/--lock\s+FALSE/,
"--replicate disables --lock" # Check that without any special options (other than --create-replicate-table)
# the tool runs without errors or warnings and checksums all tables.
ok(
no_diff(
sub { pt_table_checksum::main($dsn, '--create-replicate-table') },
"$sample/default-results-5.1.txt",
post_pipe => 'awk \'{print $2 " " $3 " " $4 " " $6 " " $8}\'',
),
"Default checksum"
); );
like( # On fast machines, the chunk size will probably be be auto-adjusted so
$output, # large that all tables will be done in a single chunk without an index.
qr/--slave-lag\s+FALSE/, # Since this varies by default, there's no use checking the checksums
"--replicate disables --slave-lag" # other than to ensure that there's at one for each table.
$row = $master_dbh->selectrow_arrayref("select count(*) from percona.checksums");
cmp_ok(
$row->[0], '>=', 37,
'At least 37 checksums'
); );
like( # ############################################################################
$output, # Static chunk size (disable --chunk-time)
qr/--wait\s+\(No value\)/, # ############################################################################
"--replicate disables --wait"
ok(
no_diff(
sub { pt_table_checksum::main($dsn, qw(--chunk-time 0)) },
"$sample/static-chunk-size-results-5.1.txt",
post_pipe => 'awk \'{print $2 " " $3 " " $4 " " $5 " " $6 " " $8}\'',
),
"Static chunk size (--chunk-time 0)"
); );
$row = $master_dbh->selectrow_arrayref("select count(*) from percona.checksums");
# #############################################################################
# Test basic --replicate functionality.
# #############################################################################
$output = output(
sub { pt_table_checksum::main(@args, qw(--function sha1)) },
);
$output2 = `/tmp/12345/use --skip-column-names -e "select this_crc from test.checksum where tbl='checksum_test'"`;
my ($cnt, $crc) = $output =~ m/checksum_test *\d+ \S+ \S+ *(\d+|NULL) *(\w+)/;
chomp $output2;
is( is(
$crc, $row->[0],
$output2, 78,
'Write checksum to --replicate table' '78 checksums'
); );
# ############################################################################# # #############################################################################
# Issue 720: mk-table-checksum --replicate should set transaction isolation # Issue 720: mk-table-checksum --replicate should set transaction isolation
# level # level
# ############################################################################# # #############################################################################
SKIP: { #SKIP: {
skip "binlog_format test for MySQL v5.1+", 6 # skip "binlog_format test for MySQL v5.1+", 6
unless $sandbox_version gt '5.0'; # unless $sandbox_version gt '5.0';
#
empty_repl_tbl(); # empty_repl_tbl();
set_binlog_format('row'); # set_binlog_format('row');
set_tx_isolation('read committed'); # set_tx_isolation('read committed');
#
$output = output( # $output = output(
sub { pt_table_checksum::main(@args) }, # sub { pt_table_checksum::main(@args) },
stderr => 1, # stderr => 1,
); # );
like( # like(
$output, # $output,
qr/test\s+checksum_test\s+0\s+127.0.0.1\s+MyISAM\s+1\s+83dcefb7/, # qr/test\s+checksum_test\s+0\s+127.0.0.1\s+MyISAM\s+1\s+83dcefb7/,
"Set session transaction isolation level repeatable read" # "Set session transaction isolation level repeatable read"
); # );
#
set_binlog_format('statement'); # set_binlog_format('statement');
set_tx_isolation('repeatable read'); # set_tx_isolation('repeatable read');
} #}
# ############################################################################# # #############################################################################
# Done. # Done.
# ############################################################################# # #############################################################################
$sb->wipe_clean($master_dbh); #$sb->wipe_clean($master_dbh);
exit; exit;

View File

@@ -0,0 +1,38 @@
ERRORS DIFFS ROWS SKIPPED TABLE
0 0 0 0 mysql.columns_priv
0 0 3 0 mysql.db
0 0 0 0 mysql.event
0 0 0 0 mysql.func
0 0 37 0 mysql.help_category
0 0 310 0 mysql.help_keyword
0 0 988 0 mysql.help_relation
0 0 489 0 mysql.help_topic
0 0 0 0 mysql.host
0 0 0 0 mysql.ndb_binlog_index
0 0 0 0 mysql.plugin
0 0 6 0 mysql.proc
0 0 0 0 mysql.procs_priv
0 0 0 0 mysql.servers
0 0 0 0 mysql.tables_priv
0 0 0 0 mysql.time_zone
0 0 0 0 mysql.time_zone_leap_second
0 0 0 0 mysql.time_zone_name
0 0 0 0 mysql.time_zone_transition
0 0 0 0 mysql.time_zone_transition_type
0 0 2 0 mysql.user
0 0 200 0 sakila.actor
0 0 603 0 sakila.address
0 0 16 0 sakila.category
0 0 600 0 sakila.city
0 0 109 0 sakila.country
0 0 599 0 sakila.customer
0 0 1000 0 sakila.film
0 0 5462 0 sakila.film_actor
0 0 1000 0 sakila.film_category
0 0 1000 0 sakila.film_text
0 0 4581 0 sakila.inventory
0 0 6 0 sakila.language
0 0 16049 0 sakila.payment
0 0 16044 0 sakila.rental
0 0 2 0 sakila.staff
0 0 2 0 sakila.store

View File

@@ -0,0 +1,38 @@
ERRORS DIFFS ROWS CHUNKS SKIPPED TABLE
0 0 0 1 0 mysql.columns_priv
0 0 3 1 0 mysql.db
0 0 0 1 0 mysql.event
0 0 0 1 0 mysql.func
0 0 37 1 0 mysql.help_category
0 0 310 1 0 mysql.help_keyword
0 0 988 1 0 mysql.help_relation
0 0 489 1 0 mysql.help_topic
0 0 0 1 0 mysql.host
0 0 0 1 0 mysql.ndb_binlog_index
0 0 0 1 0 mysql.plugin
0 0 6 1 0 mysql.proc
0 0 0 1 0 mysql.procs_priv
0 0 0 1 0 mysql.servers
0 1 0 1 0 mysql.tables_priv
0 0 0 1 0 mysql.time_zone
0 0 0 1 0 mysql.time_zone_leap_second
0 0 0 1 0 mysql.time_zone_name
0 0 0 1 0 mysql.time_zone_transition
0 0 0 1 0 mysql.time_zone_transition_type
0 0 2 1 0 mysql.user
0 0 200 1 0 sakila.actor
0 0 603 1 0 sakila.address
0 0 16 1 0 sakila.category
0 0 600 1 0 sakila.city
0 0 109 1 0 sakila.country
0 0 599 1 0 sakila.customer
0 0 1000 1 0 sakila.film
0 0 5462 6 0 sakila.film_actor
0 0 1000 1 0 sakila.film_category
0 0 1000 1 0 sakila.film_text
0 0 4581 5 0 sakila.inventory
0 0 6 1 0 sakila.language
0 0 16049 17 0 sakila.payment
0 0 16044 17 0 sakila.rental
0 0 2 1 0 sakila.staff
0 0 2 1 0 sakila.store