#! /usr/bin/perl
+
+# Copyright (c) 2012-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
eval 'exec perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
my $error=0;
my $exitcode=0;
my @bg_cmds;
+my (%environ);
$path =~ s|[^/]*$||;
push @INC,$path;
use Getopt::Long qw(GetOptions);
use strict;
use Term::ANSIColor;
+use Text::ParseWords;
use IPC::Open3;
use IO::File;
$ENV{"PRINTF_EXPONENT_DIGITS"} = "2";
}
-#Add current directory to path
-$ENV{PATH} = "$ENV{PATH}:.";
-
##
## Command line option handling
##
+sub var_subst {
+ my ($text, $name, $value) = @_;
+ if ($value) {
+ $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(\W|$)/$1/g;
+ }
+ return $text;
+}
+
# option handling helper subs
sub cd_cmd {
my $directory=$_[1];
die "[Tesh/CRITICAL] Malformed argument to setenv: expected 'name=value' but got '$_[1]'\n";
}
- if($var =~ /bindir/){
- print "[Tesh/INFO] setenv $var=$ctn\n";
- $bindir = $ctn;
- }
- else
- {
- if($var =~ /srcdir/){
- $srcdir = $ctn;
- }
- else{
- $ENV{$var} = $ctn;
- print "[Tesh/INFO] setenv $var=$ctn\n";
- }
- }
+ print "[Tesh/INFO] setenv $var=$ctn\n";
+ $environ{$var} = $ctn;
}
# Main option parsing sub
}
# cleanup the command line
- if($OS eq "WIN"){
- $cmd{'cmd'} =~ s/\${EXEEXT:=}/.exe/g;
- $cmd{'cmd'} =~ s/\${EXEEXT}/.exe/g;
- $cmd{'cmd'} =~ s/\$EXEEXT/.exe/g;
- }
- else{
- $cmd{'cmd'} =~ s/\${EXEEXT:=}//g;
- }
- $cmd{'cmd'} =~ s/\${bindir:=}/$bindir/g;
- $cmd{'cmd'} =~ s/\${srcdir:=}/$srcdir/g;
- $cmd{'cmd'} =~ s/\${bindir:=.}/$bindir/g;
- $cmd{'cmd'} =~ s/\${srcdir:=.}/$srcdir/g;
- $cmd{'cmd'} =~ s/\${bindir}/$bindir/g;
- $cmd{'cmd'} =~ s/\${srcdir}/$srcdir/g;
-# $cmd{'cmd'} =~ s|^\./||g;
-# $cmd{'cmd'} =~ s|tesh|tesh.pl|g;
- $cmd{'cmd'} =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g;
+ if($OS eq "WIN") {
+ var_subst($cmd{'cmd'}, "EXEEXT", ".exe");
+ } else {
+ var_subst($cmd{'cmd'}, "EXEEXT", "");
+ }
+
+ # substitute environ variables
+ foreach my $key (keys %environ) {
+ $cmd{'cmd'} = var_subst($cmd{'cmd'}, $key, $environ{$key});
+ }
+ # substitute remaining variables, if any
+ 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
$cmd{'cmd'} .= " $opts{'cfg'}" if (defined($opts{'cfg'}) && length($opts{'cfg'}));
+ # final cleanup
+ $cmd{'cmd'} =~ s/^\s+//;
+ $cmd{'cmd'} =~ s/\s+$//;
+
print "[$tesh_name:$cmd{'line'}] $cmd{'cmd'}\n" ;
###
$cmd{'got'} = IO::File->new_tmpfile;
$cmd{'got'}->autoflush(1);
local *E = $cmd{'got'};
- $cmd{'pid'} = open3(\*CHILD_IN, ">&E", ">&E", $cmd{'cmd'} );
+ $cmd{'pid'} = open3(\*CHILD_IN, ">&E", ">&E",
+ quotewords('\s+', 0, $cmd{'cmd'}));
# push all provided input to executing child
map { print CHILD_IN "$_\n"; } @{$cmd{'in'}};
}
use sort 'stable';
@got = sort mysort @got;
+ while (@got and $got[0] eq "") {
+ shift @got;
+ }
+
#also resort the other one, as perl sort is not the same as the C one used to generate teshes
if(defined($cmd{'out'})){
@{$cmd{'out'}}=sort mysort @{$cmd{'out'}};
+ while (@{$cmd{'out'}} and ${$cmd{'out'}}[0] eq "") {
+ shift @{$cmd{'out'}};
+ }
}
}
# Check the result of execution
###
my $diff;
- if (!defined($cmd{'output ignore'})){
+ if (defined($cmd{'output display'})){
+ print "[Tesh/INFO] Here is the (ignored) command output:\n";
+ map { print "||$_\n" } @got;
+ }
+ elsif (!defined($cmd{'output ignore'})){
$diff = build_diff(\@{$cmd{'out'}}, \@got);
}else{
- print "(ignoring the output of <$cmd{'file'}:$cmd{'line'}> as requested)\n"
+ print "(ignoring the output of <$cmd{'file'}:$cmd{'line'}> as requested)\n"
}
if (length $diff) {
print "Output of <$cmd{'file'}:$cmd{'line'}> mismatch:\n";
}
$cmd{'output ignore'} = 1;
}
+ elsif($line =~ /^!\s*output display/){ #output display
+ if (defined($cmd{'cmd'})) {
+ exec_cmd(\%cmd);
+ %cmd = ();
+ }
+ $cmd{'output display'} = 1;
+ }
elsif($line =~ /^!\s*expect signal (\w*)/) {#expect signal SIGABRT
if (defined($cmd{'cmd'})) {
exec_cmd(\%cmd);