mirror of
https://github.com/MariaDB/server.git
synced 2025-08-29 00:08:14 +03:00
Merge maint1.mysql.com:/data/localhome/tsmith/bk/51
into maint1.mysql.com:/data/localhome/tsmith/bk/maint/51
This commit is contained in:
@@ -23,7 +23,8 @@ use IO::File();
|
||||
use strict;
|
||||
|
||||
sub collect_test_cases ($);
|
||||
sub collect_one_test_case ($$$$$$$);
|
||||
sub collect_one_suite ($$);
|
||||
sub collect_one_test_case ($$$$$$$$$);
|
||||
|
||||
sub mtr_options_from_test_file($$);
|
||||
|
||||
@@ -34,147 +35,39 @@ sub mtr_options_from_test_file($$);
|
||||
##############################################################################
|
||||
|
||||
sub collect_test_cases ($) {
|
||||
my $suite= shift; # Test suite name
|
||||
my $suites= shift; # Semicolon separated list of test suites
|
||||
my $cases = []; # Array of hash
|
||||
|
||||
my $testdir;
|
||||
my $resdir;
|
||||
|
||||
if ( $suite eq "main" )
|
||||
foreach my $suite (split(",", $suites))
|
||||
{
|
||||
$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";
|
||||
collect_one_suite($suite, $cases);
|
||||
}
|
||||
|
||||
my $cases = []; # Array of hash, will be array of C struct
|
||||
|
||||
opendir(TESTDIR, $testdir) or mtr_error("Can't open dir \"$testdir\": $!");
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# 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;
|
||||
}
|
||||
|
||||
if ( @::opt_cases )
|
||||
{
|
||||
# Check that the tests specified was found
|
||||
# in at least one suite
|
||||
foreach my $tname ( @::opt_cases )
|
||||
{
|
||||
# Run in specified order, no sort
|
||||
my $elem= undef;
|
||||
my $component_id= undef;
|
||||
|
||||
# Get rid of directory part (path). Leave the extension since it is used
|
||||
# to understand type of the test.
|
||||
|
||||
$tname = basename($tname);
|
||||
|
||||
# Check if the extenstion has been specified.
|
||||
|
||||
if ( mtr_match_extension($tname, "test") )
|
||||
my $found= 0;
|
||||
foreach my $test ( @$cases )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname=~ s/\.test$//;
|
||||
$component_id= 'mysqld';
|
||||
if ( mtr_match_extension($test->{'name'}, $tname) )
|
||||
{
|
||||
$found= 1;
|
||||
}
|
||||
}
|
||||
elsif ( mtr_match_extension($tname, "imtest") )
|
||||
if ( not $found )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname =~ s/\.imtest$//;
|
||||
$component_id= 'im';
|
||||
mtr_error("Could not find $tname in any suite");
|
||||
}
|
||||
|
||||
# If target component is known, check that the specified test case
|
||||
# exists.
|
||||
#
|
||||
# Otherwise, try to guess the target component.
|
||||
|
||||
if ( $component_id )
|
||||
{
|
||||
if ( ! -f "$testdir/$elem")
|
||||
{
|
||||
mtr_error("Test case $tname ($testdir/$elem) is not found");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my $mysqld_test_exists = -f "$testdir/$tname.test";
|
||||
my $im_test_exists = -f "$testdir/$tname.imtest";
|
||||
|
||||
if ( $mysqld_test_exists and $im_test_exists )
|
||||
{
|
||||
mtr_error("Ambiguous test case name ($tname)");
|
||||
}
|
||||
elsif ( ! $mysqld_test_exists and ! $im_test_exists )
|
||||
{
|
||||
mtr_error("Test case $tname is not found");
|
||||
}
|
||||
elsif ( $mysqld_test_exists )
|
||||
{
|
||||
$elem= "$tname.test";
|
||||
$component_id= 'mysqld';
|
||||
}
|
||||
elsif ( $im_test_exists )
|
||||
{
|
||||
$elem= "$tname.imtest";
|
||||
$component_id= 'im';
|
||||
}
|
||||
}
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled,
|
||||
$component_id);
|
||||
}
|
||||
closedir TESTDIR;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach my $elem ( sort readdir(TESTDIR) )
|
||||
{
|
||||
my $component_id= undef;
|
||||
my $tname= undef;
|
||||
|
||||
if ($tname= mtr_match_extension($elem, 'test'))
|
||||
{
|
||||
$component_id = 'mysqld';
|
||||
}
|
||||
elsif ($tname= mtr_match_extension($elem, 'imtest'))
|
||||
{
|
||||
$component_id = 'im';
|
||||
}
|
||||
else
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
# Skip tests that does not match the --do-test= filter
|
||||
next if $::opt_do_test and
|
||||
! defined mtr_match_prefix($elem,$::opt_do_test);
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled,
|
||||
$component_id);
|
||||
}
|
||||
closedir TESTDIR;
|
||||
}
|
||||
|
||||
# Reorder the test cases in an order that will make them faster to run
|
||||
if ( $::opt_reorder )
|
||||
{
|
||||
|
||||
# Reorder the test cases in an order that will make them faster to run
|
||||
my %sort_criteria;
|
||||
|
||||
# Make a mapping of test name to a string that represents how that test
|
||||
@@ -246,6 +139,160 @@ sub collect_test_cases ($) {
|
||||
}
|
||||
}
|
||||
|
||||
return $cases;
|
||||
|
||||
}
|
||||
|
||||
sub collect_one_suite($$)
|
||||
{
|
||||
my $suite= shift; # Test suite name
|
||||
my $cases= shift; # List of test cases
|
||||
|
||||
mtr_verbose("Collecting: $suite");
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Build a hash of disabled testcases for this suite
|
||||
# ----------------------------------------------------------------------
|
||||
my %disabled;
|
||||
if ( open(DISABLED, "$testdir/disabled.def" ) )
|
||||
{
|
||||
while ( <DISABLED> )
|
||||
{
|
||||
chomp;
|
||||
if ( /^\s*(\S+)\s*:\s*(.*?)\s*$/ )
|
||||
{
|
||||
$disabled{$1}= $2;
|
||||
}
|
||||
}
|
||||
close DISABLED;
|
||||
}
|
||||
|
||||
# Read suite.opt file
|
||||
my $suite_opt_file= "$testdir/suite.opt";
|
||||
my $suite_opts= [];
|
||||
if ( -f $suite_opt_file )
|
||||
{
|
||||
$suite_opts= mtr_get_opts_from_file($suite_opt_file);
|
||||
}
|
||||
|
||||
if ( @::opt_cases )
|
||||
{
|
||||
# Collect in specified order, no sort
|
||||
foreach my $tname ( @::opt_cases )
|
||||
{
|
||||
my $elem= undef;
|
||||
my $component_id= undef;
|
||||
|
||||
# Get rid of directory part (path). Leave the extension since it is used
|
||||
# to understand type of the test.
|
||||
|
||||
$tname = basename($tname);
|
||||
|
||||
# Check if the extenstion has been specified.
|
||||
|
||||
if ( mtr_match_extension($tname, "test") )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname=~ s/\.test$//;
|
||||
$component_id= 'mysqld';
|
||||
}
|
||||
elsif ( mtr_match_extension($tname, "imtest") )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname =~ s/\.imtest$//;
|
||||
$component_id= 'im';
|
||||
}
|
||||
|
||||
# If target component is known, check that the specified test case
|
||||
# exists.
|
||||
#
|
||||
# Otherwise, try to guess the target component.
|
||||
|
||||
if ( $component_id )
|
||||
{
|
||||
if ( ! -f "$testdir/$elem")
|
||||
{
|
||||
mtr_error("Test case $tname ($testdir/$elem) is not found");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my $mysqld_test_exists = -f "$testdir/$tname.test";
|
||||
my $im_test_exists = -f "$testdir/$tname.imtest";
|
||||
|
||||
if ( $mysqld_test_exists and $im_test_exists )
|
||||
{
|
||||
mtr_error("Ambiguous test case name ($tname)");
|
||||
}
|
||||
elsif ( ! $mysqld_test_exists and ! $im_test_exists )
|
||||
{
|
||||
# Silently skip, could exist in another suite
|
||||
next;
|
||||
}
|
||||
elsif ( $mysqld_test_exists )
|
||||
{
|
||||
$elem= "$tname.test";
|
||||
$component_id= 'mysqld';
|
||||
}
|
||||
elsif ( $im_test_exists )
|
||||
{
|
||||
$elem= "$tname.imtest";
|
||||
$component_id= 'im';
|
||||
}
|
||||
}
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$suite,$tname,
|
||||
$elem,$cases,\%disabled,$component_id,
|
||||
$suite_opts);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
opendir(TESTDIR, $testdir) or mtr_error("Can't open dir \"$testdir\": $!");
|
||||
|
||||
foreach my $elem ( sort readdir(TESTDIR) )
|
||||
{
|
||||
my $component_id= undef;
|
||||
my $tname= undef;
|
||||
|
||||
if ($tname= mtr_match_extension($elem, 'test'))
|
||||
{
|
||||
$component_id = 'mysqld';
|
||||
}
|
||||
elsif ($tname= mtr_match_extension($elem, 'imtest'))
|
||||
{
|
||||
$component_id = 'im';
|
||||
}
|
||||
else
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
# Skip tests that does not match the --do-test= filter
|
||||
next if $::opt_do_test and
|
||||
! defined mtr_match_prefix($elem,$::opt_do_test);
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$suite,$tname,
|
||||
$elem,$cases,\%disabled,$component_id,
|
||||
$suite_opts);
|
||||
}
|
||||
closedir TESTDIR;
|
||||
}
|
||||
|
||||
return $cases;
|
||||
}
|
||||
|
||||
@@ -257,14 +304,16 @@ sub collect_test_cases ($) {
|
||||
##############################################################################
|
||||
|
||||
|
||||
sub collect_one_test_case($$$$$$$) {
|
||||
sub collect_one_test_case($$$$$$$$$) {
|
||||
my $testdir= shift;
|
||||
my $resdir= shift;
|
||||
my $suite= shift;
|
||||
my $tname= shift;
|
||||
my $elem= shift;
|
||||
my $cases= shift;
|
||||
my $disabled=shift;
|
||||
my $component_id= shift;
|
||||
my $suite_opts= shift;
|
||||
|
||||
my $path= "$testdir/$elem";
|
||||
|
||||
@@ -279,7 +328,7 @@ sub collect_one_test_case($$$$$$$) {
|
||||
|
||||
|
||||
my $tinfo= {};
|
||||
$tinfo->{'name'}= $tname;
|
||||
$tinfo->{'name'}= "$suite.$tname";
|
||||
$tinfo->{'result_file'}= "$resdir/$tname.result";
|
||||
$tinfo->{'component_id'} = $component_id;
|
||||
push(@$cases, $tinfo);
|
||||
@@ -334,6 +383,15 @@ sub collect_one_test_case($$$$$$$) {
|
||||
$tinfo->{'slave_opt'}= [];
|
||||
$tinfo->{'slave_mi'}= [];
|
||||
|
||||
# Add suite opts
|
||||
foreach my $opt ( @$suite_opts )
|
||||
{
|
||||
mtr_verbose($opt);
|
||||
push(@{$tinfo->{'master_opt'}}, $opt);
|
||||
push(@{$tinfo->{'slave_opt'}}, $opt);
|
||||
}
|
||||
|
||||
# Add master opts
|
||||
if ( -f $master_opt_file )
|
||||
{
|
||||
|
||||
@@ -394,6 +452,7 @@ sub collect_one_test_case($$$$$$$) {
|
||||
}
|
||||
}
|
||||
|
||||
# Add slave opts
|
||||
if ( -f $slave_opt_file )
|
||||
{
|
||||
my $slave_opt= mtr_get_opts_from_file($slave_opt_file);
|
||||
|
@@ -142,6 +142,7 @@ sub spawn_impl ($$$$$$$) {
|
||||
|
||||
if ( $pid )
|
||||
{
|
||||
select(STDOUT) if $::glob_win32_perl;
|
||||
return spawn_parent_impl($pid,$mode,$path);
|
||||
}
|
||||
else
|
||||
@@ -163,9 +164,6 @@ sub spawn_impl ($$$$$$$) {
|
||||
{
|
||||
# Don't redirect stdout on ActiveState perl since this is
|
||||
# just another thread in the same process.
|
||||
# Should be fixed so that the thread that is created with fork
|
||||
# executes the exe in another process and wait's for it to return.
|
||||
# In the meanwhile, we get all the output from mysqld's to screen
|
||||
}
|
||||
elsif ( ! open(STDOUT,$log_file_open_mode,$output) )
|
||||
{
|
||||
@@ -175,7 +173,7 @@ sub spawn_impl ($$$$$$$) {
|
||||
|
||||
if ( $error )
|
||||
{
|
||||
if ( $output eq $error )
|
||||
if ( !$::glob_win32_perl and $output eq $error )
|
||||
{
|
||||
if ( ! open(STDERR,">&STDOUT") )
|
||||
{
|
||||
@@ -184,15 +182,7 @@ sub spawn_impl ($$$$$$$) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( $::glob_win32_perl )
|
||||
{
|
||||
# Don't redirect stdout on ActiveState perl since this is
|
||||
# just another thread in the same process.
|
||||
# Should be fixed so that the thread that is created with fork
|
||||
# executes the exe in another process and wait's for it to return.
|
||||
# In the meanwhile, we get all the output from mysqld's to screen
|
||||
}
|
||||
elsif ( ! open(STDERR,$log_file_open_mode,$error) )
|
||||
if ( ! open(STDERR,$log_file_open_mode,$error) )
|
||||
{
|
||||
mtr_child_error("can't redirect STDERR to \"$error\": $!");
|
||||
}
|
||||
@@ -369,7 +359,7 @@ sub mtr_kill_leftovers () {
|
||||
"socket: '$srv->{path_sock}'; ".
|
||||
"port: $srv->{port})");
|
||||
|
||||
my $pid= mtr_mysqladmin_start($srv, "shutdown", 70);
|
||||
my $pid= mtr_mysqladmin_start($srv, "shutdown", 20);
|
||||
|
||||
# Save the pid of the mysqladmin process
|
||||
$admin_pids{$pid}= 1;
|
||||
@@ -613,6 +603,11 @@ sub mtr_check_stop_servers ($) {
|
||||
if ( $pid )
|
||||
{
|
||||
# Server is still alive, put it in list to be hard killed
|
||||
if ($::glob_win32_perl)
|
||||
{
|
||||
# Kill the real process if it's known
|
||||
$pid= $srv->{'real_pid'} if ($srv->{'real_pid'});
|
||||
}
|
||||
$kill_pids{$pid}= 1;
|
||||
|
||||
# Write a message to the process's error log (if it has one)
|
||||
@@ -666,6 +661,16 @@ sub mtr_check_stop_servers ($) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($::glob_win32_perl and $srv->{'real_pid'})
|
||||
{
|
||||
# Wait for the pseudo pid - if the real_pid was known
|
||||
# the pseudo pid has not been waited for yet, wai blocking
|
||||
# since it's "such a simple program"
|
||||
mtr_verbose("Wait for pseudo process $srv->{'pid'}");
|
||||
my $ret_pid= waitpid($srv->{'pid'}, 0);
|
||||
mtr_verbose("Pseudo process $ret_pid died");
|
||||
}
|
||||
|
||||
$srv->{'pid'}= 0;
|
||||
}
|
||||
}
|
||||
@@ -1043,7 +1048,7 @@ sub sleep_until_file_created ($$$) {
|
||||
{
|
||||
if ( -r $pidfile )
|
||||
{
|
||||
return $pid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
# Check if it died after the fork() was successful
|
||||
|
@@ -48,30 +48,15 @@ sub mtr_verbose (@);
|
||||
# We can't use diff -u or diff -a as these are not portable
|
||||
|
||||
sub mtr_show_failed_diff ($) {
|
||||
my $result_file_name= shift;
|
||||
my $tinfo= shift;
|
||||
|
||||
# The reject and log files have been dumped to
|
||||
# to filenames based on the result_file's name
|
||||
my $tname= basename($result_file_name);
|
||||
$tname=~ s/\..*$//;
|
||||
|
||||
my $reject_file= "r/$tname.reject";
|
||||
my $result_file= "r/$tname.result";
|
||||
my $log_file= "$::opt_vardir/log/$tname.log";
|
||||
my $eval_file= "r/$tname.eval";
|
||||
|
||||
if ( $::opt_suite ne "main" )
|
||||
{
|
||||
$reject_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$reject_file";
|
||||
$result_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$result_file";
|
||||
$eval_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$eval_file";
|
||||
$log_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$log_file";
|
||||
}
|
||||
|
||||
if ( -f $eval_file )
|
||||
{
|
||||
$result_file= $eval_file;
|
||||
}
|
||||
my $base_file= mtr_match_extension($tinfo->{'result_file'},
|
||||
"result"); # Trim extension
|
||||
my $reject_file= "$base_file.reject";
|
||||
my $result_file= "$base_file.result";
|
||||
my $log_file= "$base_file.log";
|
||||
|
||||
my $diffopts= $::opt_udiff ? "-u" : "-c";
|
||||
|
||||
|
@@ -97,9 +97,14 @@ sub mtr_timer_start($$$) {
|
||||
# clearing the signal handler.
|
||||
$SIG{INT}= 'DEFAULT';
|
||||
|
||||
$SIG{TERM}= sub {
|
||||
mtr_verbose("timer woke up, exiting!");
|
||||
exit(0);
|
||||
};
|
||||
|
||||
$0= "mtr_timer(timers,$name,$duration)";
|
||||
mtr_verbose("timer child $name, sleep $duration");
|
||||
sleep($duration);
|
||||
mtr_verbose("timer expired after $duration seconds");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
@@ -118,7 +123,7 @@ sub mtr_timer_stop ($$) {
|
||||
|
||||
# FIXME as Cygwin reuses pids fast, maybe check that is
|
||||
# the expected process somehow?!
|
||||
kill(9, $tpid);
|
||||
kill(15, $tpid);
|
||||
|
||||
# As the timers are so simple programs, we trust them to terminate,
|
||||
# and use blocking wait for it. We wait just to avoid a zombie.
|
||||
|
Reference in New Issue
Block a user