mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
ee793d030e
Bug#11792: Check all of status code, to catch a crash as a failure mtr_cases.pl: Code cleanup for skipped/disabled handling mtr_process.pl: In debug mode, report if mysqladmin did not at least make the server stop listening to the port. Increased the time waiting for terminating to 20 seconds, to wait for really slow slave shutdown. Added call to start_reap_all(), to avoid zombies. mtr_report.pl: Removed prototype for unused function mtr_report_test_disabled() mysql-test/lib/mtr_report.pl: Removed prototype for unused function mtr_report_test_disabled() mysql-test/lib/mtr_cases.pl: Code cleanup for skipped/disabled handling mysql-test/lib/mtr_process.pl: Bug#11792: Check all of status code, to catch a crash as a failure
318 lines
8.1 KiB
Perl
318 lines
8.1 KiB
Perl
# -*- cperl -*-
|
|
|
|
# This is a library file used by the Perl version of mysql-test-run,
|
|
# and is part of the translation of the Bourne shell script with the
|
|
# same name.
|
|
|
|
use File::Basename;
|
|
use strict;
|
|
|
|
sub collect_test_cases ($);
|
|
sub collect_one_test_case ($$$$$$);
|
|
|
|
##############################################################################
|
|
#
|
|
# Collect information about test cases we are to run
|
|
#
|
|
##############################################################################
|
|
|
|
sub collect_test_cases ($) {
|
|
my $suite= shift; # Test suite name
|
|
|
|
my $testdir;
|
|
my $resdir;
|
|
|
|
if ( $suite eq "main" )
|
|
{
|
|
$testdir= "$::glob_mysql_test_dir/t";
|
|
$resdir= "$::glob_mysql_test_dir/r";
|
|
}
|
|
else
|
|
{
|
|
$testdir= "$::glob_mysql_test_dir/suite/$suite/t";
|
|
$resdir= "$::glob_mysql_test_dir/suite/$suite/r";
|
|
}
|
|
|
|
my $cases = []; # Array of hash, will be array of C struct
|
|
|
|
opendir(TESTDIR, $testdir) or mtr_error("Can't open dir \"$testdir\": $!");
|
|
|
|
if ( @::opt_cases )
|
|
{
|
|
foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort
|
|
$tname= basename($tname, ".test");
|
|
my $elem= "$tname.test";
|
|
if ( ! -f "$testdir/$elem")
|
|
{
|
|
mtr_error("Test case $tname ($testdir/$elem) is not found");
|
|
}
|
|
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,{});
|
|
}
|
|
closedir TESTDIR;
|
|
}
|
|
else
|
|
{
|
|
# ----------------------------------------------------------------------
|
|
# Disable some tests listed in disabled.def
|
|
# ----------------------------------------------------------------------
|
|
my %disabled;
|
|
if ( open(DISABLED, "$testdir/disabled.def" ) )
|
|
{
|
|
while ( <DISABLED> )
|
|
{
|
|
chomp;
|
|
if ( /^\s*(\S+)\s*:\s*(.*?)\s*$/ )
|
|
{
|
|
$disabled{$1}= $2;
|
|
}
|
|
}
|
|
close DISABLED;
|
|
}
|
|
|
|
foreach my $elem ( sort readdir(TESTDIR) ) {
|
|
my $tname= mtr_match_extension($elem,"test");
|
|
next if ! defined $tname;
|
|
next if $::opt_do_test and ! defined mtr_match_prefix($elem,$::opt_do_test);
|
|
|
|
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled);
|
|
}
|
|
closedir TESTDIR;
|
|
}
|
|
|
|
# To speed things up, we sort first in if the test require a restart
|
|
# or not, second in alphanumeric order.
|
|
|
|
if ( $::opt_reorder )
|
|
{
|
|
@$cases = sort {
|
|
if ( $a->{'master_restart'} and $b->{'master_restart'} or
|
|
! $a->{'master_restart'} and ! $b->{'master_restart'} )
|
|
{
|
|
return $a->{'name'} cmp $b->{'name'};
|
|
}
|
|
if ( $a->{'master_restart'} )
|
|
{
|
|
return 1; # Is greater
|
|
}
|
|
else
|
|
{
|
|
return -1; # Is less
|
|
}
|
|
} @$cases;
|
|
}
|
|
|
|
return $cases;
|
|
}
|
|
|
|
|
|
##############################################################################
|
|
#
|
|
# Collect information about a single test case
|
|
#
|
|
##############################################################################
|
|
|
|
|
|
sub collect_one_test_case($$$$$$) {
|
|
my $testdir= shift;
|
|
my $resdir= shift;
|
|
my $tname= shift;
|
|
my $elem= shift;
|
|
my $cases= shift;
|
|
my $disabled=shift;
|
|
|
|
my $path= "$testdir/$elem";
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Skip some tests silently
|
|
# ----------------------------------------------------------------------
|
|
|
|
if ( $::opt_start_from and $tname lt $::opt_start_from )
|
|
{
|
|
return;
|
|
}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Skip some tests but include in list, just mark them to skip
|
|
# ----------------------------------------------------------------------
|
|
|
|
my $tinfo= {};
|
|
$tinfo->{'name'}= $tname;
|
|
$tinfo->{'result_file'}= "$resdir/$tname.result";
|
|
push(@$cases, $tinfo);
|
|
|
|
if ( $::opt_skip_test and defined mtr_match_prefix($tname,$::opt_skip_test) )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
return;
|
|
}
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Collect information about test case
|
|
# ----------------------------------------------------------------------
|
|
|
|
$tinfo->{'path'}= $path;
|
|
$tinfo->{'timezone'}= "GMT-3"; # for UNIX_TIMESTAMP tests to work
|
|
|
|
if ( defined mtr_match_prefix($tname,"rpl") )
|
|
{
|
|
if ( $::opt_skip_rpl )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
return;
|
|
}
|
|
|
|
$tinfo->{'slave_num'}= 1; # Default, use one slave
|
|
|
|
# FIXME currently we always restart slaves
|
|
$tinfo->{'slave_restart'}= 1;
|
|
|
|
if ( $tname eq 'rpl_failsafe' or $tname eq 'rpl_chain_temp_table' )
|
|
{
|
|
# $tinfo->{'slave_num'}= 3; # Not 3 ? Check old code, strange
|
|
}
|
|
}
|
|
|
|
if ( defined mtr_match_prefix($tname,"federated") )
|
|
{
|
|
$tinfo->{'slave_num'}= 1; # Default, use one slave
|
|
|
|
# FIXME currently we always restart slaves
|
|
$tinfo->{'slave_restart'}= 1;
|
|
}
|
|
|
|
# FIXME what about embedded_server + ndbcluster, skip ?!
|
|
|
|
my $master_opt_file= "$testdir/$tname-master.opt";
|
|
my $slave_opt_file= "$testdir/$tname-slave.opt";
|
|
my $slave_mi_file= "$testdir/$tname.slave-mi";
|
|
my $master_sh= "$testdir/$tname-master.sh";
|
|
my $slave_sh= "$testdir/$tname-slave.sh";
|
|
my $disabled_file= "$testdir/$tname.disabled";
|
|
|
|
$tinfo->{'master_opt'}= $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
|
|
$tinfo->{'slave_opt'}= $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
|
|
$tinfo->{'slave_mi'}= [];
|
|
|
|
if ( -f $master_opt_file )
|
|
{
|
|
$tinfo->{'master_restart'}= 1; # We think so for now
|
|
|
|
MASTER_OPT:
|
|
{
|
|
my $master_opt= mtr_get_opts_from_file($master_opt_file);
|
|
|
|
foreach my $opt ( @$master_opt )
|
|
{
|
|
my $value;
|
|
|
|
# This is a dirty hack from old mysql-test-run, we use the opt
|
|
# file to flag other things as well, it is not a opt list at
|
|
# all
|
|
|
|
$value= mtr_match_prefix($opt, "--timezone=");
|
|
if ( defined $value )
|
|
{
|
|
$tinfo->{'timezone'}= $value;
|
|
$tinfo->{'skip'}= 1 if $::glob_win32; # FIXME server unsets TZ
|
|
last MASTER_OPT;
|
|
}
|
|
|
|
$value= mtr_match_prefix($opt, "--result-file=");
|
|
if ( defined $value )
|
|
{
|
|
$tinfo->{'result_file'}= "r/$value.result";
|
|
if ( $::opt_result_ext and $::opt_record or
|
|
-f "$tinfo->{'result_file'}$::opt_result_ext")
|
|
{
|
|
$tinfo->{'result_file'}.= $::opt_result_ext;
|
|
}
|
|
$tinfo->{'master_restart'}= 0;
|
|
last MASTER_OPT;
|
|
}
|
|
|
|
# If we set default time zone, remove the one we have
|
|
$value= mtr_match_prefix($opt, "--default-time-zone=");
|
|
if ( defined $value )
|
|
{
|
|
$tinfo->{'master_opt'}= [];
|
|
}
|
|
|
|
}
|
|
|
|
# Ok, this was a real option list, add it
|
|
push(@{$tinfo->{'master_opt'}}, @$master_opt);
|
|
}
|
|
}
|
|
|
|
if ( -f $slave_opt_file )
|
|
{
|
|
$tinfo->{'slave_restart'}= 1;
|
|
my $slave_opt= mtr_get_opts_from_file($slave_opt_file);
|
|
|
|
foreach my $opt ( @$slave_opt )
|
|
{
|
|
# If we set default time zone, remove the one we have
|
|
my $value= mtr_match_prefix($opt, "--default-time-zone=");
|
|
$tinfo->{'slave_opt'}= [] if defined $value;
|
|
}
|
|
push(@{$tinfo->{'slave_opt'}}, @$slave_opt);
|
|
}
|
|
|
|
if ( -f $slave_mi_file )
|
|
{
|
|
$tinfo->{'slave_mi'}= mtr_get_opts_from_file($slave_mi_file);
|
|
$tinfo->{'slave_restart'}= 1;
|
|
}
|
|
|
|
if ( -f $master_sh )
|
|
{
|
|
if ( $::glob_win32_perl )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
}
|
|
else
|
|
{
|
|
$tinfo->{'master_sh'}= $master_sh;
|
|
$tinfo->{'master_restart'}= 1;
|
|
}
|
|
}
|
|
|
|
if ( -f $slave_sh )
|
|
{
|
|
if ( $::glob_win32_perl )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
}
|
|
else
|
|
{
|
|
$tinfo->{'slave_sh'}= $slave_sh;
|
|
$tinfo->{'slave_restart'}= 1;
|
|
}
|
|
}
|
|
|
|
# FIXME why this late?
|
|
if ( $disabled->{$tname} )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
$tinfo->{'disable'}= 1; # Sub type of 'skip'
|
|
$tinfo->{'comment'}= $disabled->{$tname} if $disabled->{$tname};
|
|
}
|
|
|
|
if ( -f $disabled_file )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
$tinfo->{'disable'}= 1; # Sub type of 'skip'
|
|
$tinfo->{'comment'}= mtr_fromfile($disabled_file);
|
|
}
|
|
|
|
# We can't restart a running server that may be in use
|
|
|
|
if ( $::glob_use_running_server and
|
|
( $tinfo->{'master_restart'} or $tinfo->{'slave_restart'} ) )
|
|
{
|
|
$tinfo->{'skip'}= 1;
|
|
}
|
|
}
|
|
|
|
|
|
1;
|