Sweet!

Can you document this on the wiki in the listing of all the INI fields?


On Mar 2, 2012, at 10:27 AM, mi...@osl.iu.edu wrote:

> Author: miked
> Date: 2012-03-02 10:27:34 EST (Fri, 02 Mar 2012)
> New Revision: 1440
> URL: https://svn.open-mpi.org/trac/mtt/changeset/1440
> 
> Log:
> Now it is possible to shuffle tests in mtt. The parameter that enables this 
> feature is:
> shuffle_tests=
> it can be assigned a comma separated list of allowed values: sections, tests, 
> execs, nps, args, all. 
> 
> Notations: 
>       sections - shuffle test_run sections found in mtt 
>       tests - shuffle test executables if any (we have single executable per 
> test_run)
>       execs - shuffle exec command line present in main [MTT] section
>       nps - shuffle runs with different nps
>       args - shuffle executable arguments
>       all - enable all the above.
> 
> 
> Text files modified: 
>   trunk/lib/MTT/Globals.pm           |    65 
> +++++++++++---------------------------- 
>   trunk/lib/MTT/Reporter/Email.pm    |     6 ++-                              
>        
>   trunk/lib/MTT/Reporter/TextFile.pm |     2                                  
>        
>   trunk/lib/MTT/Test/Run.pm          |     7 +++                              
>        
>   trunk/lib/MTT/Test/RunEngine.pm    |    61 
> +++++++++++++++++++++++++++++--------   
>   trunk/lib/MTT/Util.pm              |    14 ++++++-                          
>        
>   6 files changed, 89 insertions(+), 66 deletions(-)
> 
> Modified: trunk/lib/MTT/Globals.pm
> ==============================================================================
> --- trunk/lib/MTT/Globals.pm  (original)
> +++ trunk/lib/MTT/Globals.pm  2012-03-02 10:27:34 EST (Fri, 02 Mar 2012)
> @@ -80,8 +80,7 @@
> 
>     save_intermediate_report => undef,
>     save_intermediate_report_enable => undef,
> -    ini_value_run_for => undef,
> -    start_time => localtime,
> +     shuffle_tests => undef,
>     description => undef,
> };
> 
> @@ -181,50 +180,24 @@
>         $Values->{save_intermediate_report_enable} = $val;
>     }
> 
> -#    $val = MTT::Values::Value($ini, "MTT", "finish_at");
> -#    if (defined($val)) {
> -#            #finish_at format: hh:mm[dd/MM]
> -#            $val =~ m/(\d\d:\d\d)(\[(\d\d)\/(\d\d)\])*/;
> -#            my $stop_time = $1.":00";
> -#            my $stop_day = $3;
> -#            my $stop_month =$4;
> -#            my @timeData = localtime(time);
> -#            #@timedata : [0]secs [1]minutes [2]hours [3]days [4]month-1
> -#            my $finish_time = MTT::Util::parse_time_to_seconds($stop_time);
> -#                            
> -#            
> -#            my $local_time=$timeData[2].":".$timeData[1].":".$timeData[0];
> -#            my $current_time = 
> MTT::Util::parse_time_to_seconds($local_time);
> -#            
> -#            
> -#            
> -#            my $secs_left;
> -#            if ($current_time < $finish_time){
> -#                    $secs_left = $finish_time-$current_time;
> -#            } else {
> -#                    $secs_left = $finish_time+24*3600-$current_time;
> -#            }
> -#            $Values->{ini_value_run_for} = $secs_left;
> -#            
> -#            if (!$stop_month){
> -#            if ($stop_day){
> -#                    if ($stop_day < $timeData[3]){
> -#                            MTT::Messages::Warning("Stop date is less than 
> start date: disabling stop_at feature");
> -#                            $Values->{ini_value_run_for} = undef;
> -#                    }else if ($stop_day == $timeData[3]){
> -#                            if ($finish_time < $current_time){
> -#                                    MTT::Messages::Warning("The stop is 
> less than start time: disabling stop_at feature");
> -#                            }
> -#                    }else{
> -#                            if ($finish_time > $current_time){
> -#                                    $secs_left += 24*3600;
> -#                            }
> -#                    }
> -#            }
> -#            }
> -#            printf "secs_left = ",$secs_left, "hours_left = 
> ",$secs_left/3600,"\n"; 
> -#        
> -#    }
> +   
> +    $val = MTT::Values::Value($ini, "MTT", "shuffle_tests");
> +    if (defined($val)) {
> +         my @shuffles = grep length, split(/\s*,\s*/,$val);
> +         my @allowed_shuffles = ('sections', 'tests', 'execs', 'nps', 
> 'args', 'all');
> +         my %allowed_map = map { $_ => 1} @allowed_shuffles;
> +         foreach my $sh (@shuffles){
> +             if (!exists($allowed_map{$sh})){
> +                     MTT::Messages::Error("<$sh> is not allowed 
> shuffle_tests value. Allowed are:", join(',',@allowed_shuffles),".");
> +             }
> +             $Values->{shuffle_tests}->{$sh} = 1;
> +         }
> +         if ($Values->{shuffle_tests}->{all}){
> +             foreach my $allow (@allowed_shuffles){
> +                     $Values->{shuffle_tests}->{$allow} = 1;
> +             }
> +         }
> +    }
> }
> 
> #--------------------------------------------------------------------------
> 
> Modified: trunk/lib/MTT/Reporter/Email.pm
> ==============================================================================
> --- trunk/lib/MTT/Reporter/Email.pm   (original)
> +++ trunk/lib/MTT/Reporter/Email.pm   2012-03-02 10:27:34 EST (Fri, 02 Mar 
> 2012)
> @@ -148,8 +148,10 @@
>                       $to = Value( $Ini, $Section, "email_to" );
>               }
>       }
> -     my $body = $subject."\n".$footer."\n";
> -     MTT::Mail::Send($subject, $to, $from, $body );
> +     my $body = $footer."\n";
> +     if ($to){
> +             MTT::Mail::Send($subject, $to, $from, $body );
> +     }
> }
> 
> 1;
> 
> Modified: trunk/lib/MTT/Reporter/TextFile.pm
> ==============================================================================
> --- trunk/lib/MTT/Reporter/TextFile.pm        (original)
> +++ trunk/lib/MTT/Reporter/TextFile.pm        2012-03-02 10:27:34 EST (Fri, 
> 02 Mar 2012)
> @@ -142,7 +142,7 @@
> sub Flush{
>       my ($info, $entries) = @_;
>       my @results_to_flush = @results;
> -     push(@results_to_flush, $entries); 
> +     push(@results_to_flush, $entries) if $entries;
>       _summary_report(\@results_to_flush, "yes")
>         if (@results_to_flush);       
> 
> 
> Modified: trunk/lib/MTT/Test/Run.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/Run.pm (original)
> +++ trunk/lib/MTT/Test/Run.pm 2012-03-02 10:27:34 EST (Fri, 02 Mar 2012)
> @@ -77,7 +77,12 @@
> 
>     # Go through all the sections in the ini file looking for section
>     # names that begin with "Test run:"
> -    foreach my $section ($ini->Sections()) {
> +    my @sects = $ini->Sections();
> +    if ($MTT::Globals::Values->{shuffle_tests}->{sections}){
> +     MTT::Util::shuffle(\@sects);    
> +    }
> +    
> +    foreach my $section (@sects) {
>         # See if we're supposed to terminate.  Only check in the
>         # outtermost and innermost loops (even though we *could* check
>         # at every loop level); that's good enough.
> 
> Modified: trunk/lib/MTT/Test/RunEngine.pm
> ==============================================================================
> --- trunk/lib/MTT/Test/RunEngine.pm   (original)
> +++ trunk/lib/MTT/Test/RunEngine.pm   2012-03-02 10:27:34 EST (Fri, 02 Mar 
> 2012)
> @@ -39,7 +39,7 @@
> my $mpi_details_name;
> my $test_run_full_name;
> my $break_threshold;
> -
> +my $shuffle;
> # Keep track of how many tests have passed, failed, skipped, and timed out
> my $test_results_count;
> 
> @@ -52,7 +52,6 @@
> my $report_after_n_results;
> my $prev_section_name = undef;
> my $group_reports = 0;
> -my $tests_performed = 0;
> 
> #--------------------------------------------------------------------------
> 
> @@ -96,6 +95,10 @@
>     $break_threshold->{MTT::Values::TIMED_OUT} = Value($ini, $section, 
> "break_threshold_timeout");
>     $break_threshold->{MTT::Values::SKIPPED}   = Value($ini, $section, 
> "break_threshold_skipped");
>     $break_threshold->{MTT::Values::TIMED_OUT_OR_FAIL} = Value($ini, "mtt", 
> "break_threshold_timeout_and_fail");
> +    
> +     $shuffle = undef;
> +    _register_shuffles($ini,$section);
> +    
>       my $reports_per_job = Value($ini, "mtt", "reports_per_job");
>     # This boolean value defaults to 0, and allows the user to submit results
>     # after each test to ensure at least *some* results are submitted (in case
> @@ -167,6 +170,10 @@
>     $verbose_out = 0;
>     my $test_count = 0;
>     my $printed = 0;
> +    if ($shuffle->{tests}){
> +     MTT::Util::shuffle(\@{$ret->{tests}});
> +    }
> +    
>     foreach my $run (@{$ret->{tests}}) {
> 
>         # See if we're supposed to terminate.
> @@ -221,6 +228,9 @@
>         if (ref($all_np) eq "") {
>             $test_results->{$all_np} = _run_one_np($install_dir, $run, 
> $mpi_details, $all_np, $force);
>         } else {
> +             if ($shuffle->{nps}){
> +                     MTT::Util::shuffle($all_np);
> +             }
>             foreach my $this_np (@$all_np) {
>                 # See if we're supposed to terminate.
>                 last
> @@ -288,13 +298,19 @@
>         if (ref($all_argv) eq "") {
>             $all_argv = [$all_argv];
>         }
> -
> +             if ($shuffle->{args}){
> +                     MTT::Util::shuffle($all_argv);
> +             }
>         foreach my $this_argv (@$all_argv) {
>             $MTT::Test::Run::test_argv = $this_argv;
> 
>             # Get all the exec's for this one np
>             my $execs = MTT::Values::EvaluateString($mpi_details->{exec}, 
> $ini, $mpi_details_name);
> -    
> +            if (ref($execs) ne "" && $shuffle->{execs}){
> +             MTT::Util::shuffle($execs);      
> +            }
> +            
> +            
>             # If we just got one, run it.  Otherwise, loop over running them.
>             if (ref($execs) eq "") {
>                 _run_one_test($install_dir, $run, $mpi_details, $execs, 
> $name, 1,
> @@ -497,14 +513,7 @@
>                 if (exists($report->{test_result}) && 
>                     (MTT::Values::FAIL == $report->{test_result} || 
> MTT::Values::TIMED_OUT == $report->{test_result}));
> 
> -    $tests_performed++;
> 
> -     #print "\t\t--> Test #",$tests_performed," done\n";
> -     
> -             
> -     #MTT::Reporter::Flush();
> -     #MTT::Reporter::TextFile::deSubmit();
> -     
>     # If there is an after_each step, run it
>     $ENV{MTT_TEST_RUN_RESULT_MESSAGE} =
>         (MTT::Values::PASS == $report->{test_result} ? "passed" :
> @@ -558,6 +567,32 @@
>         }
>     }
> }
> -
> -
> +sub _register_shuffles{
> +     my ($ini,$section) = @_;
> +     
> +     my $val = MTT::Values::Value($ini, $section, "shuffle_tests");
> +     if (defined($val)) {
> +         my @shuffles = grep length, split(/\s*,\s*/,$val);
> +         my @allowed_shuffles = ('tests', 'execs', 'nps', 'args', 'all', 
> 'none');
> +         my %allowed_map = map { $_ => 1} @allowed_shuffles;
> +         foreach my $sh (@shuffles){
> +             if (!exists($allowed_map{$sh})){
> +                     MTT::Messages::Error("<$sh> is not allowed section 
> specific shuffle_tests value. Allowed are:", join(',',@allowed_shuffles),".");
> +             }
> +             $shuffle->{$sh} = 1;
> +         }
> +         if ($shuffle->{none}){
> +             $shuffle = undef;
> +         }
> +         if ($shuffle->{all}){
> +             foreach my $allow (@allowed_shuffles){
> +                     $shuffle->{$allow} = 1;
> +             }
> +         }
> +         
> +     }
> +    else{
> +     $shuffle = $MTT::Globals::Values->{shuffle_tests};
> +    }
> +}
> 1;
> 
> Modified: trunk/lib/MTT/Util.pm
> ==============================================================================
> --- trunk/lib/MTT/Util.pm     (original)
> +++ trunk/lib/MTT/Util.pm     2012-03-02 10:27:34 EST (Fri, 02 Mar 2012)
> @@ -208,9 +208,6 @@
>             $MTT::Globals::Internals->{is_stopped_on_break_threshold} = 
> "true";
>             $MTT::Globals::Internals->{stopped_on_break_threshold_message} = 
> "--> Threshold ($per) exceeded for \"$result_label\": $count->{$result} out 
> of $total.\n";
>             print STDOUT "--> Threshold ($per) exceeded for 
> \"$result_label\": $count->{$result} out of $total.\n";
> -            if ($MTT::Globals::Internals->{is_stopped_on_break_threshold}){
> -                print STDOUT "0xdeadbeef: it works";
> -            }
>             return 1;
>         }
>     }
> @@ -395,4 +392,15 @@
>     }
> }
> 
> +#--------------------------------------------------------------------------
> +sub shuffle{
> +     # Shuffle an array given via reference randomly
> +     my $array = shift;
> +    my $i;
> +    for ($i = @$array; --$i; ) {
> +        my $j = int rand ($i+1);
> +        next if $i == $j;
> +        @$array[$i,$j] = @$array[$j,$i];
> +    }
> +}
> 1;
> _______________________________________________
> mtt-svn mailing list
> mtt-...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/mtt-svn


-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to