#!/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 Data::Dumper; use PerconaTest; use Sandbox; require "$trunk/bin/pt-replica-find"; my $dp = new DSNParser(opts=>$dsn_opts); my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); my $replica1_dbh = $sb->get_dbh_for('replica1'); my $replica2_dbh = $sb->get_dbh_for('replica2'); # This test is sensitive to ghost/old replicas created/destroyed by other # tests. So we stop the replicas, restart the source, and start everything # again. Hopefully this will return the env to its original state. $replica2_dbh->do("STOP ${replica_name}"); $replica1_dbh->do("STOP ${replica_name}"); diag(`/tmp/12345/stop >/dev/null`); diag(`/tmp/12345/start >/dev/null`); $replica1_dbh->do("START ${replica_name}"); $replica2_dbh->do("START ${replica_name}"); my $source_dbh = $sb->get_dbh_for('source'); if ( !$source_dbh ) { plan skip_all => 'Cannot connect to sandbox source'; } elsif ( !$replica1_dbh ) { plan skip_all => 'Cannot connect to sandbox replica'; } elsif ( !$replica2_dbh ) { plan skip_all => 'Cannot connect to second sandbox replica'; } else { plan tests => 10; } my @args = ('h=127.0.0.1,P=12345,u=msandbox,p=msandbox,s=1'); my $output = `$trunk/bin/pt-replica-find --help`; like($output, qr/Prompt for a password/, 'It compiles'); # Double check that we're setup correctly. my $row = $replica2_dbh->selectall_arrayref("SHOW ${replica_name} STATUS", {Slice => {}}); is( $row->[0]->{"${source_name}_port"}, '12346', 'replica2 is replica of replica1' ) or diag(Dumper($row)); $output = `$trunk/bin/pt-replica-find -h 127.0.0.1 -P 12345 -u msandbox -p msandbox s=1 --report-format hostname`; my $expected = <&1`; like( $output, qr{PID file /tmp/mk-script.pid exists}, 'Dies if PID file already exists (issue 391)' ); `rm -rf /tmp/mk-script.pid`; # ############################################################################# # Summary report format. # ############################################################################# my $outfile = "/tmp/mk-replica-find-output.txt"; #diag(`rm -rf $outfile >/dev/null`); diag(`rm -rf $outfile`); $output = output( sub { pt_slave_find::main(@args) }, file => $outfile, ); open my $fh, "<", $outfile or die $!; my $result = do { local $/; <$fh> }; #" $result =~ s/Version.*/Version/g; $result =~ s/Uptime.*/Uptime/g; $result =~ s/[0-9]* seconds/0 seconds/g; $result =~ s/Binary logging.*/Binary logging/g; $result =~ s/Replication Is a slave, has 1 slaves connected, is.*/Replication Is a slave, has 1 slaves connected, is/g; $result =~ s/Replication Is a replica, has 1 replicas connected, is.*/Replication Is a replica, has 1 replicas connected, is/g; my $innodb_re = qr/InnoDB version\s+(.*)/; my (@innodb_versions) = $result =~ /$innodb_re/g; $result =~ s/$innodb_re/InnoDB version BUILTIN/g; my $source_version = VersionParser->new($source_dbh); my $replica_version = VersionParser->new($replica1_dbh); my $replica2_version = VersionParser->new($replica2_dbh); is( $innodb_versions[0], $source_version->innodb_version(), "pt-replica-find gets the right InnoDB version for the source" ); is( $innodb_versions[1], $replica_version->innodb_version(), "...and for the first replica" ) or diag($output); is( $innodb_versions[2], $replica2_version->innodb_version(), "...and for the second replica" ); ok( no_diff($result, ($sandbox_version ge '5.1' ? "t/pt-replica-find/samples/summary001.txt" : "t/pt-replica-find/samples/summary001-5.0.txt"), cmd_output => 1, keep_output => 1, update_samples => 1), "Summary report format", ); # ############################################################################# # Done. # ############################################################################# diag(`rm -rf $outfile >/dev/null`); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); exit;