#!/usr/bin/env perl BEGIN { die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n" unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH}; unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib"; }; use strict; use warnings FATAL => 'all'; use English qw(-no_match_vars); use Test::More; use File::Basename; $ENV{PERCONA_TOOLKIT_TEST_USE_DSN_NAMES} = 1; use PerconaTest; use Sandbox; require "$trunk/bin/pt-upgrade"; # This runs immediately if the server is already running, else it starts it. diag(`$trunk/sandbox/start-sandbox source 12348 >/dev/null`); my $dp = new DSNParser(opts=>$dsn_opts); my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); my $dbh1 = $sb->get_dbh_for('host1'); my $dbh2 = $sb->get_dbh_for('host2'); if ( !$dbh1 ) { plan skip_all => 'Cannot connect to sandbox host1'; } elsif ( !$dbh2 ) { plan skip_all => 'Cannot connect to sandbox host2'; } my $host1_dsn = $sb->dsn_for('host1'); my $host2_dsn = $sb->dsn_for('host2'); my $sample = "t/pt-upgrade/samples"; my $samples_dir = "$trunk/t/pt-upgrade/samples"; opendir(my $dh, $samples_dir) or die "Cannot open $samples_dir: $OS_ERROR"; sub load_sample_sql_files { my ($sampleno) = @_; if ( -f "$samples_dir/$sampleno/tables.sql" ) { $sb->load_file('host1', "$sample/$sampleno/tables.sql", undef, no_wait => 1); $sb->load_file('host2', "$sample/$sampleno/tables.sql", undef, no_wait => 1); } if ( -f "$samples_dir/$sampleno/host1.sql" ) { $sb->load_file('host1', "$sample/$sampleno/host1.sql", undef, no_wait => 1); } if ( -f "$samples_dir/$sampleno/host2.sql" ) { $sb->load_file('host2', "$sample/$sampleno/host2.sql", undef, no_wait => 1); } } # default 5.7 mode "STRICT_TRANS_TABLES" converts truncation warnings to errors # as this is simply a change in category of difference, we disable it for # test to work. use SqlModes; my $modes_host1 = new SqlModes($dbh1, global=>1); my $modes_host2 = new SqlModes($dbh2, global=>1); $modes_host1->del('STRICT_TRANS_TABLES'); $modes_host2->del('STRICT_TRANS_TABLES'); my @dirs = sort readdir($dh); foreach my $sampleno (@dirs) { next unless $sampleno =~ m/^\d+$/; my $conf = "$samples_dir/$sampleno/conf"; load_sample_sql_files($sampleno); foreach my $log ( glob("$samples_dir/$sampleno/*.log") ) { (my $basename = basename($log)) =~ s/\.\S+$//; my $sed; if ( -f "$samples_dir/$sampleno/$basename.sed" ) { chomp($sed = `cat $samples_dir/$sampleno/$basename.sed`); } my $output = output( sub { pt_upgrade::main( (-f $conf ? ('--config', $conf) : ()), $log, $host1_dsn, $host2_dsn, ) }, stderr => 1, ); if ( -f "$samples_dir/$sampleno/$basename.txt" ) { ok( no_diff( $output, "$sample/$sampleno/$basename.txt", cmd_output => 1, sed => [ q{'s/File: .*/File: .../'}, q{'s/ hostname: .*/ hostname: .../'}, q{'s/ MySQL: .*/ MySQL: .../'}, ($sed ? $sed : ()), ], ), "$sampleno: $basename.txt" ) or diag("\n\n---- DIFF ----\n\n", $test_diff, "\n\n---- OUTPUT ----\n\n", $output); } } } close $dh; $modes_host1->restore_original_modes(); $modes_host2->restore_original_modes(); # ############################################################################# # Done. # ############################################################################# #$sb->wipe_clean($dbh2); $sb->wipe_clean($dbh1); diag(`$trunk/sandbox/stop-sandbox 12348 >/dev/null`); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); done_testing;