mtr_cases.pl
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # -*- cperl -*-
  2. # This is a library file used by the Perl version of mysql-test-run,
  3. # and is part of the translation of the Bourne shell script with the
  4. # same name.
  5. use File::Basename;
  6. use strict;
  7. sub collect_test_cases ($);
  8. sub collect_one_test_case ($$$$$$);
  9. ##############################################################################
  10. #
  11. #  Collect information about test cases we are to run
  12. #
  13. ##############################################################################
  14. sub collect_test_cases ($) {
  15.   my $suite= shift;             # Test suite name
  16.   my $testdir;
  17.   my $resdir;
  18.   if ( $suite eq "main" )
  19.   {
  20.     $testdir= "$::glob_mysql_test_dir/t";
  21.     $resdir=  "$::glob_mysql_test_dir/r";
  22.   }
  23.   else
  24.   {
  25.     $testdir= "$::glob_mysql_test_dir/suite/$suite/t";
  26.     $resdir=  "$::glob_mysql_test_dir/suite/$suite/r";
  27.   }
  28.   my $cases = [];           # Array of hash, will be array of C struct
  29.   opendir(TESTDIR, $testdir) or mtr_error("Can't open dir "$testdir": $!");
  30.   if ( @::opt_cases )
  31.   {
  32.     foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort
  33.       $tname= basename($tname, ".test");
  34.       my $elem= "$tname.test";
  35.       if ( ! -f "$testdir/$elem")
  36.       {
  37.         mtr_error("Test case $tname ($testdir/$elem) is not found");
  38.       }
  39.       collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,{});
  40.     }
  41.     closedir TESTDIR;
  42.   }
  43.   else
  44.   {
  45.     # ----------------------------------------------------------------------
  46.     # Disable some tests listed in disabled.def
  47.     # ----------------------------------------------------------------------
  48.     my %disabled;
  49.     if ( open(DISABLED, "$testdir/disabled.def" ) )
  50.     {
  51.       while ( <DISABLED> )
  52.       {
  53.         chomp;
  54.         if ( /^s*(S+)s*:s*(.*?)s*$/ )
  55.         {
  56.           $disabled{$1}= $2;
  57.         }
  58.       }
  59.       close DISABLED;
  60.     }
  61.     foreach my $elem ( sort readdir(TESTDIR) ) {
  62.       my $tname= mtr_match_extension($elem,"test");
  63.       next if ! defined $tname;
  64.       next if $::opt_do_test and ! defined mtr_match_prefix($elem,$::opt_do_test);
  65.       collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,%disabled);
  66.     }
  67.     closedir TESTDIR;
  68.   }
  69.   # To speed things up, we sort first in if the test require a restart
  70.   # or not, second in alphanumeric order.
  71.   if ( $::opt_reorder )
  72.   {
  73.     @$cases = sort {
  74.       if ( $a->{'master_restart'} and $b->{'master_restart'} or
  75.            ! $a->{'master_restart'} and ! $b->{'master_restart'} )
  76.       {
  77.         return $a->{'name'} cmp $b->{'name'};
  78.       }
  79.       if ( $a->{'master_restart'} )
  80.       {
  81.         return 1;                 # Is greater
  82.       }
  83.       else
  84.       {
  85.         return -1;                # Is less
  86.       }
  87.     } @$cases;
  88.   }
  89.   return $cases;
  90. }
  91. ##############################################################################
  92. #
  93. #  Collect information about a single test case
  94. #
  95. ##############################################################################
  96. sub collect_one_test_case($$$$$$) {
  97.   my $testdir= shift;
  98.   my $resdir=  shift;
  99.   my $tname=   shift;
  100.   my $elem=    shift;
  101.   my $cases=   shift;
  102.   my $disabled=shift;
  103.   my $path= "$testdir/$elem";
  104.   # ----------------------------------------------------------------------
  105.   # Skip some tests silently
  106.   # ----------------------------------------------------------------------
  107.   if ( $::opt_start_from and $tname lt $::opt_start_from )
  108.   {
  109.     return;
  110.   }
  111.   # ----------------------------------------------------------------------
  112.   # Skip some tests but include in list, just mark them to skip
  113.   # ----------------------------------------------------------------------
  114.   my $tinfo= {};
  115.   $tinfo->{'name'}= $tname;
  116.   $tinfo->{'result_file'}= "$resdir/$tname.result";
  117.   push(@$cases, $tinfo);
  118.   if ( $::opt_skip_test and defined mtr_match_prefix($tname,$::opt_skip_test) )
  119.   {
  120.     $tinfo->{'skip'}= 1;
  121.     return;
  122.   }
  123.   # ----------------------------------------------------------------------
  124.   # Collect information about test case
  125.   # ----------------------------------------------------------------------
  126.   $tinfo->{'path'}= $path;
  127.   $tinfo->{'timezone'}= "GMT-3"; # for UNIX_TIMESTAMP tests to work
  128.   if ( defined mtr_match_prefix($tname,"rpl") )
  129.   {
  130.     if ( $::opt_skip_rpl )
  131.     {
  132.       $tinfo->{'skip'}= 1;
  133.       return;
  134.     }
  135.     $tinfo->{'slave_num'}= 1;           # Default, use one slave
  136.     # FIXME currently we always restart slaves
  137.     $tinfo->{'slave_restart'}= 1;
  138.     if ( $tname eq 'rpl_failsafe' or $tname eq 'rpl_chain_temp_table' )
  139.     {
  140. #      $tinfo->{'slave_num'}= 3;         # Not 3 ? Check old code, strange
  141.     }
  142.   }
  143.   if ( defined mtr_match_prefix($tname,"federated") )
  144.   {
  145.     $tinfo->{'slave_num'}= 1;           # Default, use one slave
  146.     # FIXME currently we always restart slaves
  147.     $tinfo->{'slave_restart'}= 1;
  148.   }
  149.   # FIXME what about embedded_server + ndbcluster, skip ?!
  150.   my $master_opt_file= "$testdir/$tname-master.opt";
  151.   my $slave_opt_file=  "$testdir/$tname-slave.opt";
  152.   my $slave_mi_file=   "$testdir/$tname.slave-mi";
  153.   my $master_sh=       "$testdir/$tname-master.sh";
  154.   my $slave_sh=        "$testdir/$tname-slave.sh";
  155.   my $disabled_file=   "$testdir/$tname.disabled";
  156.   $tinfo->{'master_opt'}= $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
  157.   $tinfo->{'slave_opt'}=  $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
  158.   $tinfo->{'slave_mi'}=   [];
  159.   if ( -f $master_opt_file )
  160.   {
  161.     $tinfo->{'master_restart'}= 1;    # We think so for now
  162.   MASTER_OPT:
  163.     {
  164.       my $master_opt= mtr_get_opts_from_file($master_opt_file);
  165.       foreach my $opt ( @$master_opt )
  166.       {
  167.         my $value;
  168.         # This is a dirty hack from old mysql-test-run, we use the opt
  169.         # file to flag other things as well, it is not a opt list at
  170.         # all
  171.         $value= mtr_match_prefix($opt, "--timezone=");
  172.         if ( defined $value )
  173.         {
  174.           $tinfo->{'timezone'}= $value;
  175.           $tinfo->{'skip'}= 1 if $::glob_win32; # FIXME server unsets TZ
  176.           last MASTER_OPT;
  177.         }
  178.         $value= mtr_match_prefix($opt, "--result-file=");
  179.         if ( defined $value )
  180.         {
  181.           $tinfo->{'result_file'}= "r/$value.result";
  182.           if ( $::opt_result_ext and $::opt_record or
  183.                -f "$tinfo->{'result_file'}$::opt_result_ext")
  184.           {
  185.             $tinfo->{'result_file'}.= $::opt_result_ext;
  186.           }
  187.           $tinfo->{'master_restart'}= 0;
  188.           last MASTER_OPT;
  189.         }
  190.         # If we set default time zone, remove the one we have
  191.         $value= mtr_match_prefix($opt, "--default-time-zone=");
  192.         if ( defined $value )
  193.         {
  194.           $tinfo->{'master_opt'}= [];
  195.         }
  196.       }
  197.       # Ok, this was a real option list, add it
  198.       push(@{$tinfo->{'master_opt'}}, @$master_opt);
  199.     }
  200.   }
  201.   if ( -f $slave_opt_file )
  202.   {
  203.     $tinfo->{'slave_restart'}= 1;
  204.     my $slave_opt= mtr_get_opts_from_file($slave_opt_file);
  205.     foreach my $opt ( @$slave_opt )
  206.     {
  207.       # If we set default time zone, remove the one we have
  208.       my $value= mtr_match_prefix($opt, "--default-time-zone=");
  209.       $tinfo->{'slave_opt'}= [] if defined $value;
  210.     }
  211.     push(@{$tinfo->{'slave_opt'}}, @$slave_opt);
  212.   }
  213.   if ( -f $slave_mi_file )
  214.   {
  215.     $tinfo->{'slave_mi'}= mtr_get_opts_from_file($slave_mi_file);
  216.     $tinfo->{'slave_restart'}= 1;
  217.   }
  218.   if ( -f $master_sh )
  219.   {
  220.     if ( $::glob_win32_perl )
  221.     {
  222.       $tinfo->{'skip'}= 1;
  223.     }
  224.     else
  225.     {
  226.       $tinfo->{'master_sh'}= $master_sh;
  227.       $tinfo->{'master_restart'}= 1;
  228.     }
  229.   }
  230.   if ( -f $slave_sh )
  231.   {
  232.     if ( $::glob_win32_perl )
  233.     {
  234.       $tinfo->{'skip'}= 1;
  235.     }
  236.     else
  237.     {
  238.       $tinfo->{'slave_sh'}= $slave_sh;
  239.       $tinfo->{'slave_restart'}= 1;
  240.     }
  241.   }
  242.   # FIXME why this late?
  243.   if ( $disabled->{$tname} )
  244.   {
  245.     $tinfo->{'skip'}= 1;
  246.     $tinfo->{'disable'}= 1;   # Sub type of 'skip'
  247.     $tinfo->{'comment'}= $disabled->{$tname} if $disabled->{$tname};
  248.   }
  249.   if ( -f $disabled_file )
  250.   {
  251.     $tinfo->{'skip'}= 1;
  252.     $tinfo->{'disable'}= 1;   # Sub type of 'skip'
  253.     $tinfo->{'comment'}= mtr_fromfile($disabled_file);
  254.   }
  255.   # We can't restart a running server that may be in use
  256.   if ( $::glob_use_running_server and
  257.        ( $tinfo->{'master_restart'} or $tinfo->{'slave_restart'} ) )
  258.   {
  259.     $tinfo->{'skip'}= 1;
  260.   }
  261. }
  262. 1;