diff options
Diffstat (limited to 'mysql-test/mysql-test-run.pl')
-rwxr-xr-x | mysql-test/mysql-test-run.pl | 192 |
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); |