Files
percona-toolkit/t/lib/Schema.t
Carlos Salguero 4408d5f6c2 PT-96 Fixed tests for Schema.pm
Forced sorting of some arrays to make them possible to test
2017-03-09 17:14:37 -03:00

232 lines
4.7 KiB
Perl

#!/usr/bin/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 tests => 15;
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Quotekeys = 0;
use PerconaTest;
use Quoter;
use TableParser;
use FileIterator;
use SchemaIterator;
use Schema;
use OptionParser;
use DSNParser;
my $in = "$trunk/t/lib/samples/mysqldump-no-data/";
my $q = new Quoter;
my $tp = new TableParser(Quoter => $q);
my $fi = new FileIterator();
my $o = new OptionParser(description => 'SchemaIterator');
@ARGV = qw();
$o->get_specs("$trunk/bin/pt-table-checksum");
$o->get_opts();
my $file_itr = $fi->get_file_itr("$in/dump001.txt");
my $sq = new Schema();
my $si = new SchemaIterator (
file_itr => $file_itr,
OptionParser => $o,
Quoter => $q,
TableParser => $tp,
Schema => $sq,
);
# Init the schema (SchemaIterator calls Schema::add_schema_object()).
1 while(defined $si->next());
#ok(
# $sq->is_duplicate_column('c1')
# && $sq->is_duplicate_column('c2'),
# "Duplicate columns in dump001.txt"
#);
#ok(
# $sq->is_duplicate_table('a'),
# "Duplicate tables in dump001.txt"
#);
# ############################################################################
# Test find columns in the schema.
# ############################################################################
sub test_find_col {
my ($got, $expect, $test_name) = @_;
my @got_tbls;
foreach my $tbl ( @$got ) {
push @got_tbls, [$tbl->{db}, $tbl->{tbl}];
}
is_deeply(
\@got_tbls,
$expect,
$test_name,
) or print Dumper(\@got_tbls);
}
# First by column name, what would be parsed from a query.
test_find_col(
$sq->find_column(col_name => 'c3'),
[['test','b']],
"Find column c3"
);
test_find_col(
$sq->find_column(col_name => 'b.c3'),
[['test','b']],
"Find column b.c3"
);
test_find_col(
$sq->find_column(col_name => 'test.b.c3'),
[['test','b']],
"Find column test.b.c3"
);
test_find_col(
$sq->find_column(col_name => 'c1'),
[
['test', 'b'],
['test', 'a'],
['test2', 'a'],
],
"Find duplicate column c1"
);
test_find_col(
$sq->find_column(col_name => 'a.c1'),
[
['test', 'a'],
['test2', 'a'],
],
"Find duplicate table.column a.c1"
);
test_find_col(
$sq->find_column(col_name => 'xyz'),
[],
"Cannot find nonexistent column name"
);
# Then by a tbl struct, what's used by Schema.
test_find_col(
$sq->find_column(col => 'c3'),
[['test','b']],
"Find column c3 (struct)"
);
test_find_col(
$sq->find_column(tbl => 'b', col => 'c3'),
[['test','b']],
"Find column b.c3 (struct)"
);
test_find_col(
$sq->find_column(db => 'test', tbl => 'b', col => 'c3'),
[['test','b']],
"Find column test.b.c3 (struct)"
);
test_find_col(
$sq->find_column(col => 'c1'),
[
['test', 'b'],
['test', 'a'],
['test2', 'a'],
],
"Find duplicate column c1 (struct)"
);
test_find_col(
$sq->find_column(tbl => 'a', col => 'c1'),
[
['test', 'a'],
['test2', 'a'],
],
"Find duplicate table.column a.c1 (struct)"
);
test_find_col(
$sq->find_column(col => 'xyz'),
[],
"Cannot find nonexistent column name (struct)"
);
# ############################################################################
# Test find tables in the schema.
# ############################################################################
sub test_find_tbl {
my ($got, $expect, $test_name) = @_;
my @got_dbs;
foreach my $db ( @$got ) {
push @got_dbs, $db;
}
is_deeply(
\@got_dbs,
$expect,
$test_name,
) or print Dumper(\@got_dbs);
}
test_find_tbl(
$sq->find_table(tbl => 'a'),
['test', 'test2'],
"Find table a"
);
# ############################################################################
# Test ignore.
# ############################################################################
test_find_col(
$sq->find_column(
col => 'c1',
ignore => [
{ db => 'test', tbl => 'a' },
{ db => 'test2', tbl => 'a' },
],
),
[
#['test', 'a'], # IGNORED
['test', 'b'],
#['test2', 'a'], # IGNORED
],
"Ignore tables"
);
# #############################################################################
# Done.
# #############################################################################
my $output = '';
{
local *STDERR;
open STDERR, '>', \$output;
$sq->_d('Complete test coverage');
}
like(
$output,
qr/Complete test coverage/,
'_d() works'
);
exit;