Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Crude hack to ignore cruft from Java on Windows
[simgrid.git] / tools / tesh / tesh.pl
index d01ce83..6867c3a 100755 (executable)
@@ -33,7 +33,9 @@ they produce the expected output and return the expected value.
                         launching the tests
   --setenv var=value  : set a specific environment variable
   --cfg arg           : add parameter --cfg=arg to each command line
                         launching the tests
   --setenv var=value  : set a specific environment variable
   --cfg arg           : add parameter --cfg=arg to each command line
+  --log arg           : add parameter --log=arg to each command line
   --enable-coverage   : ignore output lines starting with "profiling:"
   --enable-coverage   : ignore output lines starting with "profiling:"
+  --enable-sanitizers : ignore output lines starting with containing warnings
 
 =head1 TEST SUITE FILE SYTAX
 
 
 =head1 TEST SUITE FILE SYTAX
 
@@ -176,7 +178,7 @@ by the lexicographical sort.
 
 The solution is to prefix each line of your output with temporal
 information so that lines can be grouped by timestamps. The
 
 The solution is to prefix each line of your output with temporal
 information so that lines can be grouped by timestamps. The
-lexicographical sort then only applies to lines that occured at the
+lexicographical sort then only applies to lines that occurred at the
 same timestamp. Here is a SimGrid example:
 
     # Sort only lines depending on the first 19 chars
 same timestamp. Here is a SimGrid example:
 
     # Sort only lines depending on the first 19 chars
@@ -238,11 +240,13 @@ BEGIN {
 }
 
 my $enable_coverage        = 0;
 }
 
 my $enable_coverage        = 0;
+my $enable_sanitizers        = 0;
 my $diff_tool              = 0;
 my $diff_tool_tmp_fh       = 0;
 my $diff_tool_tmp_filename = 0;
 my $sort_prefix            = -1;
 my $tesh_file;
 my $diff_tool              = 0;
 my $diff_tool_tmp_fh       = 0;
 my $diff_tool_tmp_filename = 0;
 my $sort_prefix            = -1;
 my $tesh_file;
+my $tesh_name;
 my $error    = 0;
 my $exitcode = 0;
 my @bg_cmds;
 my $error    = 0;
 my $exitcode = 0;
 my @bg_cmds;
@@ -303,12 +307,17 @@ GetOptions(
     'timeout=s' => \$opts{'timeout'},
     'setenv=s'  => sub { setenv_cmd( $_[1] ) },
     'cfg=s' => sub { $opts{'cfg'} .= " --cfg=$_[1]" },
     'timeout=s' => \$opts{'timeout'},
     'setenv=s'  => sub { setenv_cmd( $_[1] ) },
     'cfg=s' => sub { $opts{'cfg'} .= " --cfg=$_[1]" },
+    'log=s' => sub { $opts{'log'} .= " --log=$_[1]" },
     'enable-coverage+' => \$enable_coverage,
     'enable-coverage+' => \$enable_coverage,
+    'enable-sanitizers+' => \$enable_sanitizers,
 );
 
 $tesh_file = pop @ARGV;
 );
 
 $tesh_file = pop @ARGV;
+$tesh_name = $tesh_file;
+$tesh_name =~ s|^.*?/([^/]*)$|$1|;
 
 print "Enable coverage\n" if ($enable_coverage);
 
 print "Enable coverage\n" if ($enable_coverage);
+print "Enable sanitizers\n" if ($enable_sanitizers);
 
 if ($diff_tool) {
     use File::Temp qw/ tempfile /;
 
 if ($diff_tool) {
     use File::Temp qw/ tempfile /;
@@ -319,7 +328,7 @@ if ($diff_tool) {
 if ( $tesh_file =~ m/(.*)\.tesh/ ) {
     print "Test suite `$tesh_file'\n";
 } else {
 if ( $tesh_file =~ m/(.*)\.tesh/ ) {
     print "Test suite `$tesh_file'\n";
 } else {
-    $tesh_file = "(stdin)";
+    $tesh_name = "(stdin)";
     print "Test suite from stdin\n";
 }
 
     print "Test suite from stdin\n";
 }
 
@@ -339,22 +348,24 @@ sub exec_cmd {
     }
 
     # substitute remaining variables, if any
     }
 
     # substitute remaining variables, if any
-    while ( $cmd{'cmd'} =~ /\${(\w+)(?::[=-][^}]*)?}/ ) {
+    while ( $cmd{'cmd'} =~ /\$\{(\w+)(?::[=-][^}]*)?\}/ ) {
         $cmd{'cmd'} = var_subst( $cmd{'cmd'}, $1, "" );
     }
     while ( $cmd{'cmd'} =~ /\$(\w+)/ ) {
         $cmd{'cmd'} = var_subst( $cmd{'cmd'}, $1, "" );
     }
 
         $cmd{'cmd'} = var_subst( $cmd{'cmd'}, $1, "" );
     }
     while ( $cmd{'cmd'} =~ /\$(\w+)/ ) {
         $cmd{'cmd'} = var_subst( $cmd{'cmd'}, $1, "" );
     }
 
-    # add cfg options
+    # add cfg and log options
     $cmd{'cmd'} .= " $opts{'cfg'}"
       if ( defined( $opts{'cfg'} ) && length( $opts{'cfg'} ) );
     $cmd{'cmd'} .= " $opts{'cfg'}"
       if ( defined( $opts{'cfg'} ) && length( $opts{'cfg'} ) );
+    $cmd{'cmd'} .= " $opts{'log'}"
+      if ( defined( $opts{'log'} ) && length( $opts{'log'} ) );
 
     # finally trim any remaining space chars
     $cmd{'cmd'} =~ s/^\s+//;
     $cmd{'cmd'} =~ s/\s+$//;
 
 
     # finally trim any remaining space chars
     $cmd{'cmd'} =~ s/^\s+//;
     $cmd{'cmd'} =~ s/\s+$//;
 
-    print "[$cmd{'file'}:$cmd{'line'}] $cmd{'cmd'}\n";
+    print "[$tesh_name:$cmd{'line'}] $cmd{'cmd'}\n";
 
     $cmd{'return'} ||= 0;
     $cmd{'timeout'} ||= $opts{'timeout'};
 
     $cmd{'return'} ||= 0;
     $cmd{'timeout'} ||= $opts{'timeout'};
@@ -363,7 +374,15 @@ sub exec_cmd {
     ###
     # exec the command line
 
     ###
     # exec the command line
 
-    my @cmdline = quotewords( '\s+', 0, $cmd{'cmd'} );
+    my @cmdline;
+    if(defined $ENV{VALGRIND_COMMAND}) {
+      push @cmdline, $ENV{VALGRIND_COMMAND};
+      push @cmdline, split(" ", $ENV{VALGRIND_OPTIONS});
+      if($cmd{'timeout'} ne 'no'){
+          $cmd{'timeout'}=$cmd{'timeout'}*20
+      }
+    }
+    push @cmdline, quotewords( '\s+', 0, $cmd{'cmd'} );
     my $input = defined($cmd{'in'})? join("\n",@{$cmd{'in'}}) : "";
     my $output = " " x 10240; $output = ""; # Preallocate 10kB, and reset length to 0
     $cmd{'got'} = \$output;
     my $input = defined($cmd{'in'})? join("\n",@{$cmd{'in'}}) : "";
     my $output = " " x 10240; $output = ""; # Preallocate 10kB, and reset length to 0
     $cmd{'got'} = \$output;
@@ -388,7 +407,7 @@ sub analyze_result {
     eval {
        finish( $cmd{'job'} );
     };
     eval {
        finish( $cmd{'job'} );
     };
-    if ($@) { # deal with the errors that occured in the child process
+    if ($@) { # deal with the errors that occurred in the child process
        if ($@ =~ /timeout/) {
            $cmd{'job'}->kill_kill;
            $cmd{'timeouted'} = 1;
        if ($@ =~ /timeout/) {
            $cmd{'job'}->kill_kill;
            $cmd{'timeouted'} = 1;
@@ -410,9 +429,12 @@ sub analyze_result {
         chomp $got;
         print $diff_tool_tmp_fh "> $got\n" if ($diff_tool);
 
         chomp $got;
         print $diff_tool_tmp_fh "> $got\n" if ($diff_tool);
 
-        unless ( $enable_coverage and $got =~ /^profiling:/ ) {
+        unless (( $enable_coverage and $got =~ /^profiling:/ ) or
+            ( $enable_sanitizers and $got =~ m/WARNING: ASan doesn't fully support/) or
+            ( $got =~ m/Unable to clean temporary file C:/)) # Crude hack to ignore cruft from Java on Windows
+        {
             push @got, $got;
             push @got, $got;
-        }
+        } 
     }
 
     # How did the child process terminate?
     }
 
     # How did the child process terminate?
@@ -450,12 +472,12 @@ sub analyze_result {
     # Did it end as expected?
     if ( $cmd{'gotret'} ne $wantret ) {
         $error = 1;
     # Did it end as expected?
     if ( $cmd{'gotret'} ne $wantret ) {
         $error = 1;
-        my $msg = "Test suite `$cmd{'file'}': NOK (<$cmd{'file'}:$cmd{'line'}> $cmd{'gotret'})\n";
+        my $msg = "Test suite `$tesh_name': NOK (<$tesh_name:$cmd{'line'}> $cmd{'gotret'})\n";
         if ( scalar @got ) {
         if ( scalar @got ) {
-            $msg = $msg . "Output of <$cmd{'file'}:$cmd{'line'}> so far:\n";
+            $msg = $msg . "Output of <$tesh_name:$cmd{'line'}> so far:\n";
            map { $msg .= "|| $_\n" } @got;
         } else {
            map { $msg .= "|| $_\n" } @got;
         } else {
-           $msg .= "<$cmd{'file'}:$cmd{'line'}> No output so far.\n";
+           $msg .= "<$tesh_name:$cmd{'line'}> No output so far.\n";
        }
         print STDERR "$msg";
     }
        }
         print STDERR "$msg";
     }
@@ -493,12 +515,12 @@ sub analyze_result {
         print "[Tesh/INFO] Here is the (ignored) command output:\n";
         map { print "||$_\n" } @got;
     } elsif ( defined( $cmd{'output ignore'} ) ) {
         print "[Tesh/INFO] Here is the (ignored) command output:\n";
         map { print "||$_\n" } @got;
     } elsif ( defined( $cmd{'output ignore'} ) ) {
-        print "(ignoring the output of <$cmd{'file'}:$cmd{'line'}> as requested)\n";
+        print "(ignoring the output of <$tesh_name:$cmd{'line'}> as requested)\n";
     } else {
         my $diff = build_diff( \@{ $cmd{'out'} }, \@got );
     
        if ( length $diff ) {
     } else {
         my $diff = build_diff( \@{ $cmd{'out'} }, \@got );
     
        if ( length $diff ) {
-           print "Output of <$cmd{'file'}:$cmd{'line'}> mismatch" . ( $cmd{'sort'} ? " (even after sorting)" : "" ) . ":\n";
+           print "Output of <$tesh_name:$cmd{'line'}> mismatch" . ( $cmd{'sort'} ? " (even after sorting)" : "" ) . ":\n";
            map { print "$_\n" } split( /\n/, $diff );
            if ( $cmd{'sort'} ) {
                print "WARNING: Both the observed output and expected output were sorted as requested.\n";
            map { print "$_\n" } split( /\n/, $diff );
            if ( $cmd{'sort'} ) {
                print "WARNING: Both the observed output and expected output were sorted as requested.\n";
@@ -511,7 +533,7 @@ sub analyze_result {
                # print "--------------->8----  End of the unprocessed observed output.\n";
            }
            
                # print "--------------->8----  End of the unprocessed observed output.\n";
            }
            
-           print "Test suite `$cmd{'file'}': NOK (<$cmd{'file'}:$cmd{'line'}> output mismatch)\n";
+           print "Test suite `$tesh_name': NOK (<$tesh_name:$cmd{'line'}> output mismatch)\n";
            exit 2;
        }
     }
            exit 2;
        }
     }
@@ -519,7 +541,7 @@ sub analyze_result {
 
 # parse tesh file
 my $infh;    # The file descriptor from which we should read the teshfile
 
 # parse tesh file
 my $infh;    # The file descriptor from which we should read the teshfile
-if ( $tesh_file eq "(stdin)" ) {
+if ( $tesh_name eq "(stdin)" ) {
     $infh = *STDIN;
 } else {
     open $infh, $tesh_file
     $infh = *STDIN;
 } else {
     open $infh, $tesh_file
@@ -527,8 +549,6 @@ if ( $tesh_file eq "(stdin)" ) {
 }
 
 my %cmd;     # everything about the next command to run
 }
 
 my %cmd;     # everything about the next command to run
-my $tesh_name = $tesh_file;
-$tesh_name =~ s|^.*?/([^/]*)$|$1|;
 my $line_num = 0;
 LINE: while ( not $error and defined( my $line = <$infh> )) {
     chomp $line;
 my $line_num = 0;
 LINE: while ( not $error and defined( my $line = <$infh> )) {
     chomp $line;
@@ -613,7 +633,6 @@ LINE: while ( not $error and defined( my $line = <$infh> )) {
 
         } else {    # regular command
             $cmd{'cmd'}  = $arg;
 
         } else {    # regular command
             $cmd{'cmd'}  = $arg;
-            $cmd{'file'} = $tesh_name;
             $cmd{'line'} = $line_num;
         }
 
             $cmd{'line'} = $line_num;
         }
 
@@ -625,7 +644,6 @@ LINE: while ( not $error and defined( my $line = <$infh> )) {
        
         $cmd{'background'} = 1;
         $cmd{'cmd'}        = $arg;
        
         $cmd{'background'} = 1;
         $cmd{'cmd'}        = $arg;
-        $cmd{'file'}       = $tesh_name;
         $cmd{'line'}       = $line_num;
 
     # Deal with the meta-commands
         $cmd{'line'}       = $line_num;
 
     # Deal with the meta-commands
@@ -662,7 +680,7 @@ LINE: while ( not $error and defined( my $line = <$infh> )) {
 }
 
 # We are done reading the input file
 }
 
 # We are done reading the input file
-close $infh unless ( $tesh_file eq "(stdin)" );
+close $infh unless ( $tesh_name eq "(stdin)" );
 
 # Deal with last command, if any
 if ( defined( $cmd{'cmd'} ) ) {
 
 # Deal with last command, if any
 if ( defined( $cmd{'cmd'} ) ) {
@@ -683,7 +701,7 @@ if ($diff_tool) {
 
 if ( $error != 0 ) {
     exit $exitcode;
 
 if ( $error != 0 ) {
     exit $exitcode;
-} elsif ( $tesh_file eq "(stdin)" ) {
+} elsif ( $tesh_name eq "(stdin)" ) {
     print "Test suite from stdin OK\n";
 } else {
     print "Test suite `$tesh_name' OK\n";
     print "Test suite from stdin OK\n";
 } else {
     print "Test suite `$tesh_name' OK\n";
@@ -731,11 +749,11 @@ sub build_diff {
 sub var_subst {
     my ( $text, $name, $value ) = @_;
     if ($value) {
 sub var_subst {
     my ( $text, $name, $value ) = @_;
     if ($value) {
-        $text =~ s/\${$name(?::[=-][^}]*)?}/$value/g;
+        $text =~ s/\$\{$name(?::[=-][^}]*)?\}/$value/g;
         $text =~ s/\$$name(\W|$)/$value$1/g;
     } else {
         $text =~ s/\$$name(\W|$)/$value$1/g;
     } else {
-        $text =~ s/\${$name:=([^}]*)}/$1/g;
-        $text =~ s/\${$name}//g;
+        $text =~ s/\$\{$name:=([^}]*)\}/$1/g;
+        $text =~ s/\$\{$name\}//g;
         $text =~ s/\$$name(\W|$)/$1/g;
     }
     return $text;
         $text =~ s/\$$name(\W|$)/$1/g;
     }
     return $text;
@@ -771,7 +789,7 @@ sub cd_cmd($) {
         print "Chdir to $directory failed: No such file or directory\n";
     }
     if ( $failure == 1 ) {
         print "Chdir to $directory failed: No such file or directory\n";
     }
     if ( $failure == 1 ) {
-        print "Test suite `$cmd{'filefile'}': NOK (system error)\n";
+        print "Test suite `$tesh_name': NOK (system error)\n";
         exit 4;
     }
 }
         exit 4;
     }
 }
@@ -779,7 +797,7 @@ sub cd_cmd($) {
 # Command setenv. Gets "variable=content", and update the environment accordingly
 sub setenv_cmd($) {
     my $arg = shift;
 # Command setenv. Gets "variable=content", and update the environment accordingly
 sub setenv_cmd($) {
     my $arg = shift;
-    if ( $arg =~ /^(.*)=(.*)$/ ) {
+    if ( $arg =~ /^(.*?)=(.*)$/ ) {
         my ( $var, $ctn ) = ( $1, $2 );
         print "[Tesh/INFO] setenv $var=$ctn\n";
         $environ{$var} = $ctn;
         my ( $var, $ctn ) = ( $1, $2 );
         print "[Tesh/INFO] setenv $var=$ctn\n";
         $environ{$var} = $ctn;