X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ac679d5e69b1eb25e3f82be198607593407e7fc5..47fec7f016d13ee8697f18c470321bc88673f68d:/tools/tesh/tesh.pl diff --git a/tools/tesh/tesh.pl b/tools/tesh/tesh.pl index d01ce83b85..6867c3a232 100755 --- a/tools/tesh/tesh.pl +++ b/tools/tesh/tesh.pl @@ -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 + --log arg : add parameter --log=arg to each command line --enable-coverage : ignore output lines starting with "profiling:" + --enable-sanitizers : ignore output lines starting with containing warnings =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 -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 @@ -238,11 +240,13 @@ BEGIN { } 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 $tesh_name; 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]" }, + 'log=s' => sub { $opts{'log'} .= " --log=$_[1]" }, 'enable-coverage+' => \$enable_coverage, + 'enable-sanitizers+' => \$enable_sanitizers, ); $tesh_file = pop @ARGV; +$tesh_name = $tesh_file; +$tesh_name =~ s|^.*?/([^/]*)$|$1|; print "Enable coverage\n" if ($enable_coverage); +print "Enable sanitizers\n" if ($enable_sanitizers); 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 { - $tesh_file = "(stdin)"; + $tesh_name = "(stdin)"; print "Test suite from stdin\n"; } @@ -339,22 +348,24 @@ sub exec_cmd { } # 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, "" ); } - # add cfg options + # add cfg and log options $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+$//; - print "[$cmd{'file'}:$cmd{'line'}] $cmd{'cmd'}\n"; + print "[$tesh_name:$cmd{'line'}] $cmd{'cmd'}\n"; $cmd{'return'} ||= 0; $cmd{'timeout'} ||= $opts{'timeout'}; @@ -363,7 +374,15 @@ sub exec_cmd { ### # 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; @@ -388,7 +407,7 @@ sub analyze_result { 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; @@ -410,9 +429,12 @@ sub analyze_result { 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; - } + } } # 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; - 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 ) { - $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 { - $msg .= "<$cmd{'file'}:$cmd{'line'}> No output so far.\n"; + $msg .= "<$tesh_name:$cmd{'line'}> No output so far.\n"; } 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 "(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 ) { - 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"; @@ -511,7 +533,7 @@ sub analyze_result { # 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; } } @@ -519,7 +541,7 @@ sub analyze_result { # 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 @@ -527,8 +549,6 @@ if ( $tesh_file eq "(stdin)" ) { } 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; @@ -613,7 +633,6 @@ LINE: while ( not $error and defined( my $line = <$infh> )) { } else { # regular command $cmd{'cmd'} = $arg; - $cmd{'file'} = $tesh_name; $cmd{'line'} = $line_num; } @@ -625,7 +644,6 @@ LINE: while ( not $error and defined( my $line = <$infh> )) { $cmd{'background'} = 1; $cmd{'cmd'} = $arg; - $cmd{'file'} = $tesh_name; $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 -close $infh unless ( $tesh_file eq "(stdin)" ); +close $infh unless ( $tesh_name eq "(stdin)" ); # Deal with last command, if any if ( defined( $cmd{'cmd'} ) ) { @@ -683,7 +701,7 @@ if ($diff_tool) { 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"; @@ -731,11 +749,11 @@ sub build_diff { 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:=([^}]*)}/$1/g; - $text =~ s/\${$name}//g; + $text =~ s/\$\{$name:=([^}]*)\}/$1/g; + $text =~ s/\$\{$name\}//g; $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 "Test suite `$cmd{'filefile'}': NOK (system error)\n"; + print "Test suite `$tesh_name': NOK (system error)\n"; 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; - if ( $arg =~ /^(.*)=(.*)$/ ) { + if ( $arg =~ /^(.*?)=(.*)$/ ) { my ( $var, $ctn ) = ( $1, $2 ); print "[Tesh/INFO] setenv $var=$ctn\n"; $environ{$var} = $ctn;