summaryrefslogtreecommitdiff
path: root/mysql-test/mysql-test-run.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/mysql-test-run.pl')
-rwxr-xr-xmysql-test/mysql-test-run.pl192
1 files changed, 132 insertions, 60 deletions
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index ba426446075..3949148ec49 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -107,6 +107,17 @@ our $default_vardir;
our $opt_vardir; # Path to use for var/ dir
my $path_vardir_trace; # unix formatted opt_vardir for trace files
my $opt_tmpdir; # Path to use for tmp/ dir
+my $opt_tmpdir_pid;
+
+END {
+ if ( defined $opt_tmpdir_pid and $opt_tmpdir_pid == $$ )
+ {
+ # Remove the tempdir this process has created
+ mtr_verbose("Removing tmpdir '$opt_tmpdir");
+ rmtree($opt_tmpdir);
+ }
+}
+
my $path_config_file; # The generated config file, var/my.cnf
# Visual Studio produces executables in different sub-directories based on the
@@ -152,8 +163,9 @@ our $opt_force;
our $opt_mem= $ENV{'MTR_MEM'};
our $opt_gcov;
-our $opt_gcov_err;
-our $opt_gcov_msg;
+our $opt_gcov_exe= "gcov";
+our $opt_gcov_err= "mysql-test-gcov.msg";
+our $opt_gcov_msg= "mysql-test-gcov.err";
our $glob_debugger= 0;
our $opt_gdb;
@@ -169,12 +181,18 @@ our $opt_client_debugger;
my $config; # The currently running config
my $current_config_name; # The currently running config file template
+our $opt_experimental;
+our $experimental_test_cases;
+
my $baseport;
my $opt_build_thread= $ENV{'MTR_BUILD_THREAD'} || "auto";
+my $build_thread= 0;
my $opt_record;
my $opt_report_features;
+my $opt_skip_core;
+
our $opt_check_testcases= 1;
my $opt_mark_progress;
@@ -385,7 +403,7 @@ sub main {
mtr_print_line();
if ( $opt_gcov ) {
- gcov_collect($basedir, $opt_gcov,
+ gcov_collect($basedir, $opt_gcov_exe,
$opt_gcov_msg, $opt_gcov_err);
}
@@ -665,14 +683,9 @@ sub run_worker ($) {
report_option('name',"worker[$thread_num]");
# --------------------------------------------------------------------------
- # Use auto build thread in all but first worker
+ # Set different ports per thread
# --------------------------------------------------------------------------
- set_build_thread_ports($thread_num > 1 ? 'auto' : $opt_build_thread);
-
- if (check_ports_free()){
- # Some port was not free(which one has already been printed)
- mtr_error("Some port(s) was not free")
- }
+ set_build_thread_ports($thread_num);
# --------------------------------------------------------------------------
# Turn off verbosity in workers, unless explicitly specified
@@ -792,7 +805,7 @@ sub command_line_setup {
'big-test' => \$opt_big_test,
'combination=s' => \@opt_combinations,
'skip-combinations' => \&collect_option,
-
+ 'experimental=s' => \$opt_experimental,
'skip-im' => \&ignore_option,
# Specify ports
@@ -932,12 +945,12 @@ sub command_line_setup {
}
# Look for language files and charsetsdir, use same share
- my $path_share= mtr_path_exists("$basedir/share/mysql",
- "$basedir/sql/share",
- "$basedir/share");
+ $path_language= mtr_path_exists("$basedir/share/mysql/english",
+ "$basedir/sql/share/english",
+ "$basedir/share/english");
+
-
- $path_language= mtr_path_exists("$path_share/english");
+ my $path_share= dirname($path_language);
$path_charsetsdir= mtr_path_exists("$path_share/charsets");
if (using_extern())
@@ -959,6 +972,33 @@ sub command_line_setup {
mtr_print_thick_line('#');
}
+ if ( $opt_experimental )
+ {
+ # read the list of experimental test cases from the file specified on
+ # the command line
+ open(FILE, "<", $opt_experimental) or mtr_error("Can't read experimental file: $opt_experimental");
+ mtr_report("Using experimental file: $opt_experimental");
+ $experimental_test_cases = [];
+ while(<FILE>) {
+ chomp;
+ # remove comments (# foo) at the beginning of the line, or after a
+ # blank at the end of the line
+ s/( +|^)#.*$//;
+ # remove whitespace
+ s/^ +//;
+ s/ +$//;
+ # if nothing left, don't need to remember this line
+ if ( $_ eq "" ) {
+ next;
+ }
+ # remember what is left as the name of another test case that should be
+ # treated as experimental
+ print " - $_\n";
+ push @$experimental_test_cases, $_;
+ }
+ close FILE;
+ }
+
foreach my $arg ( @ARGV )
{
if ( $arg =~ /^--skip-/ )
@@ -1066,8 +1106,11 @@ sub command_line_setup {
" creating a shorter one...");
# Create temporary directory in standard location for temporary files
- $opt_tmpdir= tempdir( TMPDIR => 1, CLEANUP => 1 );
+ $opt_tmpdir= tempdir( TMPDIR => 1, CLEANUP => 0 );
mtr_report(" - using tmpdir: '$opt_tmpdir'\n");
+
+ # Remember pid that created dir so it's removed by correct process
+ $opt_tmpdir_pid= $$;
}
}
$opt_tmpdir =~ s,/+$,,; # Remove ending slash if any
@@ -1080,6 +1123,14 @@ sub command_line_setup {
}
# --------------------------------------------------------------------------
+ # Check parallel value
+ # --------------------------------------------------------------------------
+ if ($opt_parallel < 1)
+ {
+ mtr_error("0 or negative parallel value makes no sense, use positive number");
+ }
+
+ # --------------------------------------------------------------------------
# Record flag
# --------------------------------------------------------------------------
if ( $opt_record and ! @opt_cases )
@@ -1268,18 +1319,32 @@ sub command_line_setup {
# But a fairly safe range seems to be 5001 - 32767
#
sub set_build_thread_ports($) {
- my $build_thread= shift || 0;
+ my $thread= shift || 0;
- if ( lc($build_thread) eq 'auto' ) {
- #mtr_report("Requesting build thread... ");
- $build_thread= mtr_get_unique_id(250, 299);
- if ( !defined $build_thread ) {
- mtr_error("Could not get a unique build thread id");
+ if ( lc($opt_build_thread) eq 'auto' ) {
+ my $found_free = 0;
+ $build_thread = 250; # Start attempts from here
+ while (! $found_free)
+ {
+ $build_thread= mtr_get_unique_id($build_thread, 299);
+ if ( !defined $build_thread ) {
+ mtr_error("Could not get a unique build thread id");
+ }
+ $found_free= check_ports_free($build_thread);
+ # If not free, release and try from next number
+ mtr_release_unique_id($build_thread++) unless $found_free;
}
- #mtr_report(" - got $build_thread");
+ }
+ else
+ {
+ $build_thread = $opt_build_thread + $thread - 1;
}
$ENV{MTR_BUILD_THREAD}= $build_thread;
- $opt_build_thread= $build_thread;
+
+ if (! check_ports_free($build_thread)) {
+ # Some port was not free(which one has already been printed)
+ mtr_error("Some port(s) was not free")
+ }
# Calculate baseport
$baseport= $build_thread * 10 + 10000;
@@ -1535,14 +1600,22 @@ sub mysql_fix_arguments () {
}
-sub client_arguments ($) {
+sub client_arguments ($;$) {
my $client_name= shift;
+ my $group_suffix= shift;
my $client_exe= mtr_exe_exists("$path_client_bindir/$client_name");
my $args;
mtr_init_args(\$args);
mtr_add_arg($args, "--defaults-file=%s", $path_config_file);
- client_debug_arg($args, $client_name);
+ if (defined($group_suffix)) {
+ mtr_add_arg($args, "--defaults-group-suffix=%s", $group_suffix);
+ client_debug_arg($args, "$client_name-$group_suffix");
+ }
+ else
+ {
+ client_debug_arg($args, $client_name);
+ }
return mtr_args2str($client_exe, @$args);
}
@@ -1793,6 +1866,7 @@ sub environment_setup {
$ENV{'MYSQL_SHOW'}= client_arguments("mysqlshow");
$ENV{'MYSQL_BINLOG'}= client_arguments("mysqlbinlog");
$ENV{'MYSQL'}= client_arguments("mysql");
+ $ENV{'MYSQL_SLAVE'}= client_arguments("mysql", ".2");
$ENV{'MYSQL_UPGRADE'}= client_arguments("mysql_upgrade");
$ENV{'MYSQLADMIN'}= native_path($exe_mysqladmin);
$ENV{'MYSQL_CLIENT_TEST'}= mysql_client_test_arguments();
@@ -2433,22 +2507,18 @@ sub kill_leftovers ($) {
# Check that all the ports that are going to
# be used are free
#
-sub check_ports_free
+sub check_ports_free ($)
{
- my @ports_to_check;
- for ($baseport..$baseport+9){
- push(@ports_to_check, $_);
- }
- #mtr_report("Checking ports...");
- # print "@ports_to_check\n";
- foreach my $port (@ports_to_check){
- if (mtr_ping_port($port)){
- mtr_report(" - 'localhost:$port' was not free");
- return 1; # One port was not free
+ my $bthread= shift;
+ my $portbase = $bthread * 10 + 10000;
+ for ($portbase..$portbase+9){
+ if (mtr_ping_port($_)){
+ mtr_report(" - 'localhost:$_' was not free");
+ return 0; # One port was not free
}
}
- return 0; # All ports free
+ return 1; # All ports free
}
@@ -2860,9 +2930,6 @@ test case was executed:\n";
$result= 2;
}
- # Remove the .err file the check generated
- unlink($err_file);
-
# Remove the .result file the check generated
unlink("$base_file.result");
@@ -3470,7 +3537,10 @@ sub start_check_warnings ($$) {
my $name= "warnings-".$mysqld->name();
- extract_warning_lines($mysqld->value('log-error'));
+ my $log_error= $mysqld->value('#log-error');
+ # To be communicated to the test
+ $ENV{MTR_LOG_ERROR}= $log_error;
+ extract_warning_lines($log_error);
my $args;
mtr_init_args(\$args);
@@ -3480,6 +3550,7 @@ sub start_check_warnings ($$) {
mtr_add_arg($args, "--skip-safemalloc");
mtr_add_arg($args, "--test-file=%s", "include/check-warnings.test");
+ mtr_add_arg($args, "--verbose");
if ( $opt_embedded_server )
{
@@ -3569,10 +3640,9 @@ sub check_warnings ($) {
if ( $res == 62 ) {
# Test case was ok and called "skip"
- ;
+ # Remove the .err file the check generated
+ unlink($err_file);
}
- # Remove the .err file the check generated
- unlink($err_file);
if ( keys(%started) == 0){
# All checks completed
@@ -3594,8 +3664,6 @@ sub check_warnings ($) {
$result= 2;
}
- # Remove the .err file the check generated
- unlink($err_file);
}
elsif ( $proc eq $timeout_proc ) {
$tinfo->{comment}.= "Timeout $timeout_proc for ".
@@ -3947,6 +4015,7 @@ sub mysqld_arguments ($$$) {
mtr_add_arg($args, "%s", $arg);
}
}
+ $opt_skip_core = $found_skip_core;
if ( !$found_skip_core )
{
mtr_add_arg($args, "%s", "--core-file");
@@ -3986,6 +4055,12 @@ sub mysqld_start ($$) {
$path_vardir_trace, $mysqld->name());
}
+ if (IS_WINDOWS)
+ {
+ # Trick the server to send output to stderr, with --console
+ mtr_add_arg($args, "--console");
+ }
+
if ( $opt_gdb || $opt_manual_gdb )
{
gdb_arguments(\$args, \$exe, $mysqld->name());
@@ -4018,7 +4093,7 @@ sub mysqld_start ($$) {
# Remove the old pidfile if any
unlink($mysqld->value('pid-file'));
- my $output= $mysqld->value('log-error');
+ my $output= $mysqld->value('#log-error');
if ( $opt_valgrind and $opt_debug )
{
# When both --valgrind and --debug is selected, send
@@ -4038,6 +4113,7 @@ sub mysqld_start ($$) {
error => $output,
append => 1,
verbose => $opt_verbose,
+ nocore => $opt_skip_core,
host => undef,
shutdown => sub { mysqld_stop($mysqld) },
);
@@ -4090,12 +4166,6 @@ sub server_need_restart {
return 0;
}
- if ( $opt_embedded_server )
- {
- mtr_verbose_restart($server, "no start or restart for embedded server");
- return 0;
- }
-
if ( $tinfo->{'force_restart'} ) {
mtr_verbose_restart($server, "forced in .opt file");
return 1;
@@ -4325,7 +4395,7 @@ sub start_servers($) {
# Already started
# Write start of testcase to log file
- mark_log($mysqld->value('log-error'), $tinfo);
+ mark_log($mysqld->value('#log-error'), $tinfo);
next;
}
@@ -4384,7 +4454,7 @@ sub start_servers($) {
mkpath($tmpdir) unless -d $tmpdir;
# Write start of testcase to log file
- mark_log($mysqld->value('log-error'), $tinfo);
+ mark_log($mysqld->value('#log-error'), $tinfo);
# Run <tname>-master.sh
if ($mysqld->option('#!run-master-sh') and
@@ -4435,7 +4505,7 @@ sub start_servers($) {
$tinfo->{comment}=
"Failed to start ".$mysqld->name();
- my $logfile= $mysqld->value('log-error');
+ my $logfile= $mysqld->value('#log-error');
if ( defined $logfile and -f $logfile )
{
$tinfo->{logfile}= mtr_fromfile($logfile);
@@ -4479,6 +4549,7 @@ sub start_check_testcase ($$$) {
mtr_add_arg($args, "--result-file=%s", "$opt_vardir/tmp/$name.result");
mtr_add_arg($args, "--test-file=%s", "include/check-testcase.test");
+ mtr_add_arg($args, "--verbose");
if ( $mode eq "before" )
{
@@ -4648,8 +4719,7 @@ sub start_mysqltest ($) {
elsif ( $opt_client_debugger )
{
debugger_arguments(\$args, \$exe, "client");
- }
-
+ }
my $proc= My::SafeProcess->new
(
@@ -5048,6 +5118,8 @@ Misc options
to turn off.
sleep=SECONDS Passed to mysqltest, will be used as fixed sleep time
+ gcov Collect coverage information after the test.
+ The result is a gcov file per source and header file.
HERE
exit(1);