Commit 5adb9347 authored by unknown's avatar unknown
Browse files

Improve sort algorithm for reorder, all test with smae name except for ending...

Improve sort algorithm for reorder, all test with smae name except for ending digit should be run after each other. 
Example of that is ndb_autodiscover[1-3]


parent 40e44f0e
Loading
Loading
Loading
Loading
+52 −18
Original line number Diff line number Diff line
@@ -159,37 +159,71 @@ sub collect_test_cases ($) {
  {

    my %sort_criteria;
    my $tinfo;

    # Make a mapping of test name to a string that represents how that test
    # should be sorted among the other tests.  Put the most important criterion
    # first, then a sub-criterion, then sub-sub-criterion, et c.
    foreach $tinfo (@$cases)
    foreach my $tinfo (@$cases)
    {
      my @this_criteria = ();
      my @criteria = ();

      # Look for tests that muct be in run in a defined order
      # that is defined by test having the same name except for
      # the ending digit

      # Put variables into hash
      my $test_name= $tinfo->{'name'};
      my $depend_on_test_name;
      if ( $test_name =~ /^([\D]+)([0-9]{1})$/ )
      {
	my $base_name= $1;
	my $idx= $2;
	mtr_verbose("$test_name =>  $base_name idx=$idx");
	if ( $idx > 1 )
	{
	  $idx-= 1;
	  $base_name= "$base_name$idx";
	  mtr_verbose("New basename $base_name");
	}

	foreach my $tinfo2 (@$cases)
	{
	  if ( $tinfo2->{'name'} eq $base_name )
	  {
	    mtr_verbose("found dependent test $tinfo2->{'name'}");
	    $depend_on_test_name=$base_name;
	  }
	}
      }

      if ( defined $depend_on_test_name )
      {
	mtr_verbose("Giving $test_name same critera as $depend_on_test_name");
	$sort_criteria{$test_name} = $sort_criteria{$depend_on_test_name};
      }
      else
      {
	#
	# Append the criteria for sorting, in order of importance.
	#

      push(@this_criteria, "ndb=" . ($tinfo->{'ndb_test'} ? "1" : "0"));
      push(@this_criteria, "restart=" . ($tinfo->{'master_restart'} ? "1" : "0"));
      # Group test with similar options together.
	push(@criteria, "ndb=" . ($tinfo->{'ndb_test'} ? "1" : "0"));
	push(@criteria, "restart=" . ($tinfo->{'master_restart'} ? "1" : "0"));
	# Group test with equal options together.
	# Ending with "~" makes empty sort later than filled
      push(@this_criteria, join("!", sort @{$tinfo->{'master_opt'}}) . "~");
	push(@criteria, join("!", sort @{$tinfo->{'master_opt'}}) . "~");

      # Finally, order by the name
      push(@this_criteria, $tinfo->{'name'});

      $sort_criteria{$tinfo->{"name"}} = join(" ", @this_criteria);
	$sort_criteria{$test_name} = join(" ", @criteria);
      }
    }

    @$cases = sort { $sort_criteria{$a->{"name"}} cmp $sort_criteria{$b->{"name"}}; } @$cases;
    @$cases = sort {
      $sort_criteria{$a->{'name'}} . $a->{'name'} cmp
	$sort_criteria{$b->{'name'}} . $b->{'name'}; } @$cases;

    if ( $::opt_script_debug )
    {
      # For debugging the sort-order
      foreach $tinfo (@$cases)
      foreach my $tinfo (@$cases)
      {
	print("$sort_criteria{$tinfo->{'name'}} -> \t$tinfo->{'name'}\n");
      }