X-Git-Url: http://nitlanguage.org diff --git a/tests/tests.sh b/tests/tests.sh index 14be6d4..2aff98a 100755 --- a/tests/tests.sh +++ b/tests/tests.sh @@ -18,26 +18,81 @@ # This shell script compile, run and verify Nit program files # Set lang do default to avoid failed tests because of locale -export LANG=C -export LC_ALL=C +export LANG=C.UTF-8 + +# Explore candidates for LC_ALL +# +# If C.UTF-8, the most agnostic UTF-8 locale is supported, we +# use it, otherwise we default to the UTF-8 system locale, and +# if unavailable, we default on C. +# +# Note that C however is not guaranteed to be UTF-8, and +# some tests may fail when relying on Unicode semantics. +locale_candidate=C.UTF-8 +if ! locale -a 2>/dev/null | grep -q C.UTF-8; then + locale_candidate="$(locale -a | grep -i utf8 | head -n1)" + if [ -z "$locale_candidate" ]; then + locale_candidate=C + fi +fi +export LC_ALL="$locale_candidate" + +if uname | grep Darwin 1>/dev/null 2>&1; then + export LANG=en_US.UTF-8 + export LC_ALL=en_US.UTF-8 +fi + export NIT_TESTING=true -export MNIT_SRAND=0 +# Use the pid as a collision prevention +export NIT_TESTING_ID=$$ +export NIT_SRAND=0 + +# Identify this as a tests.sh test to differentiate from a nitunit test +export NIT_TESTING_TESTS_SH=true unset NIT_DIR # Get the first Java lib available -shopt -s nullglob -paths=`echo /usr/lib/jvm/*/` -paths=($paths) -JAVA_HOME=${paths[0]} +if which_java=$(which javac 2>/dev/null); then + + if sh -c "readlink -f ." 1>/dev/null 2>&1; then + READLINK="readlink -f" + else + # Darwin? + READLINK="readlink" + fi + JAVA_HOME=$(dirname $(dirname $($READLINK "$which_java"))) -paths=`echo $JAVA_HOME/jre/lib/*/{client,server}/` -paths=($paths) -JNI_LIB_PATH=${paths[0]} -shopt -u nullglob + shopt -s nullglob + paths=`echo $JAVA_HOME/jre/lib/*/{client,server}/libjvm.so` + if [ -n "$paths" ]; then + paths=($paths) + JNI_LIB_PATH=`dirname ${paths[0]}` + fi + shopt -u nullglob +fi outdir="out" -compdir=".nit_compile" +compdir="nit_compile" + +# User CPU time limit (in seconds) +# Is used to avoid to CPU intensive test (infinite loops). See ulimit -t +usertimelimit=600 # 1 CPU minute + +# Real-time limit (in seconds) +# Is used to avoid waiting or sleeping tests. +# Require timeout or timelimit, or else is not used. +realtimelimit=300 # 5 min + +# User limit for write files (in kilo-bytes) +# Is used to avoid execution that loop and fill the hard drive. See ulimit -f +# Note that a test might require a lot of temporary disk space (eg. nitc+gcc) +filelimit=100000 # ~100MB + +# Limit (in bytes) for generated .res file. +# Larger ones are truncated and will fail tests +# Is used to avoid processing huge crappy res file (diff, xml, etc) +reslimit=100000 # ~100KB usage() { @@ -47,11 +102,12 @@ Usage: $e [options] modulenames -o option Pass option to the engine -v Verbose (show tests steps) -h This help ---engine Use a specific engine (default=nitg) +--engine Use a specific engine (default=nitc) --noskip Do not skip a test even if the .skip file matches --outdir Use a specific output folder (default=out/) ---compdir Use a specific temporary compilation folder (default=.nit_compile) +--compdir Use a specific temporary compilation folder (default=$compdir) --node Run as a node in parallel, will not output context information +--autosav Copy the .res files directly in the sav folder overriding existing .res files END } @@ -65,18 +121,24 @@ saferun() local o= local a= while [ $stop = false ]; do - case $1 in + case "$1" in -o) o="$2"; shift; shift;; -a) a="-a"; shift;; *) stop=true esac done - if test -n "$TIME"; then + ( + ulimit -f "$filelimit" 2> /dev/null + ulimit -t "$usertimelimit" 2> /dev/null + if test -d "$1"; then + find $1 | sort + elif test -n "$TIME"; then $TIME -o "$o" $a $TIMEOUT "$@" else - $TIMEOUT "$@" if test -n "$a"; then echo 0 >> "$o"; else echo 0 > "$o"; fi + $TIMEOUT "$@" fi + ) } # Output a timestamp attribute for XML, or an empty line @@ -94,18 +156,20 @@ timestamp() # Detect a working timeout if sh -c "timelimit echo" 1>/dev/null 2>&1; then - TIMEOUT="timelimit -t 600" + TIMEOUT="timelimit -t $realtimelimit" elif sh -c "timeout 1 echo" 1>/dev/null 2>&1; then - TIMEOUT="timeout 600s" + TIMEOUT="timeout ${realtimelimit}s" else echo "No timelimit or timeout command detected. Tests may hang :(" fi # Detect a working time command -if env time --quiet -f%U true 2>/dev/null; then - TIME="env time --quiet -f%U" -elif env time -f%U true 2>/dev/null; then - TIME="env time -f%U" +if command time --quiet -f%e true 2>/dev/null; then + TIME="command time --quiet -f%e" +elif command time -f%e true 2>/dev/null; then + TIME="command time -f%e" +elif command gtime -f%e true 2>/dev/null; then + TIME="command gtime -f%e" else TIME= fi @@ -117,6 +181,15 @@ else TIMESTAMP= fi +# Detect a working hostname command +if hostname --version 2>&1 | grep coreutils >/dev/null 2>&1; then + HOSTNAME="hostname" +else + HOSTNAME="hostname -s" +fi + +UNAME=`uname | sed s/-.*//` + # $1 is the pattern of the test # $2 is the file to compare to # the result is: @@ -129,8 +202,8 @@ function compare_to_result() local pattern="$1" local sav="$2" if [ ! -r "$sav" ]; then return 0; fi - test "`cat "$sav"`" = "UNDEFINED" && return 1 - diff -u "$sav" "$outdir/$pattern.res" > "$outdir/$pattern.diff.sav.log" + test "`cat -- "$sav"`" = "UNDEFINED" && return 1 + diff -u --strip-trailing-cr -- "$sav" "$outdir/$pattern.res" > "$outdir/$pattern.diff.sav.log" if [ "$?" == 0 ]; then return 1 fi @@ -138,7 +211,7 @@ function compare_to_result() sed '/[Ww]arning/d;/[Ee]rror/d' "$sav" > "$outdir/$pattern.sav2" grep '[Ee]rror' "$outdir/$pattern.res" >/dev/null && echo "Error" >> "$outdir/$pattern.res2" grep '[Ee]rror' "$sav" >/dev/null && echo "Error" >> "$outdir/$pattern.sav2" - diff -u "$outdir/$pattern.sav2" "$outdir/$pattern.res2" > "$outdir/$pattern.diff.sav.log2" + diff -u --strip-trailing-cr "$outdir/$pattern.sav2" "$outdir/$pattern.res2" > "$outdir/$pattern.diff.sav.log2" if [ "$?" == 0 ]; then return 2 else @@ -146,28 +219,44 @@ function compare_to_result() fi } +function xmlesc() +{ + sed 's/&/\&/g; s//\>/g; s/"/\"/g; s/'"'"'/\'/g'<>$xml "" + local pattern=$1 + local description=$2 + local pack=$3 + local SAV="" + local NSAV="" + local FIXME="" + local NFIXME="" + local SOSO="" + local NSOSO="" + local SOSOF="" + local NSOSOF="" + local OLD="" + local LIST="" + local FIRST="" + + # Truncate too big res file + local size=$(wc -c < "$outdir/$pattern.res") + if test -n "$reslimit" -a "$size" -gt "$reslimit"; then + # The most portable way to truncate a file is with Perl + perl -e "truncate \"$outdir/$pattern.res\", $reslimit;" + echo "***TRUNCATED***" >> "$outdir/$pattern.res" + fi + + echo >>$xml "" #for sav in "sav/$engine/fixme/$pattern.res" "sav/$engine/$pattern.res" "sav/fixme/$pattern.res" "sav/$pattern.res" "sav/$pattern.sav"; do for savdir in $savdirs; do - sav=$savdir/fixme/$pattern.res + local sav=$savdir/fixme/$pattern.res compare_to_result "$pattern" "$sav" case "$?" in 0) @@ -220,13 +309,14 @@ function process_result() esac done OLD=`echo "$OLD" | sed -e 's/ */ /g' -e 's/^ //' -e 's/ $//'` - grep 'NOT YET IMPLEMENTED' "$outdir/$pattern.res" >/dev/null + istodo "$outdir/$pattern.res" NYI="$?" if [ -n "$SAV" ]; then if [ -n "$OLD" ]; then echo "[*ok*] $outdir/$pattern.res $SAV - but $OLD remains!" - echo >>$xml "" + echo >>$xml "" remains="$remains $OLD" + test "$autosav" = "true" && rm "$OLD" else echo "[ok] $outdir/$pattern.res $SAV" fi @@ -234,8 +324,9 @@ function process_result() elif [ -n "$FIXME" ]; then if [ -n "$OLD" ]; then echo "[*fixme*] $outdir/$pattern.res $FIXME - but $OLD remains!" - echo >>$xml "" + echo >>$xml "" remains="$remains $OLD" + test "$autosav" = "true" && rm "$OLD" else echo "[fixme] $outdir/$pattern.res $FIXME" echo >>$xml "" @@ -247,52 +338,57 @@ function process_result() todos="$todos $pattern" elif [ -n "$SOSO" ]; then echo "[======= soso $outdir/$pattern.res $SOSO =======]" - echo >>$xml "" + echo >>$xml "" echo >>$xml ">$xml -n 50 + cat -v -- "$outdir/$pattern.diff.sav.log" | head >>$xml -n 50 echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" + test "$autosav" = "true" && cp "$outdir/$pattern.res" "$SOSO" elif [ -n "$SOSOF" ]; then echo "[======= fixme soso $outdir/$pattern.res $SOSOF =======]" - echo >>$xml "" + echo >>$xml "" echo >>$xml ">$xml -n 50 + cat -v -- "$outdir/$pattern.diff.sav.log" | head >>$xml -n 50 echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" + test "$autosav" = "true" && cp "$outdir/$pattern.res" && "$SOSO" elif [ -n "$NSAV" ]; then echo "[======= fail $outdir/$pattern.res $NSAV =======]" - echo >>$xml "" + echo >>$xml "" echo >>$xml ">$xml -n 50 + cat -v -- "$outdir/$pattern.diff.sav.log" | head >>$xml -n 50 echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" + test "$autosav" = "true" && cp "$outdir/$pattern.res" "$NSAV" elif [ -n "$NFIXME" ]; then echo "[======= changed $outdir/$pattern.res $NFIXME ======]" - echo >>$xml "" + echo >>$xml "" echo >>$xml ">$xml -n 50 + cat -v -- "$outdir/$pattern.diff.sav.log" | head >>$xml -n 50 echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" - elif [ -s $outdir/$pattern.res ]; then + test "$autosav" = "true" && cp "$outdir/$pattern.res" "$NFIXME" + elif [ -s "$outdir/$pattern.res" ]; then echo "[=== no sav ===] $outdir/$pattern.res is not empty" echo >>$xml "" echo >>$xml ">$xml $outdir/$pattern.res + cat -v >>$xml -- "$outdir/$pattern.res" echo >>$xml "]]>" nos="$nos $pattern" echo "$ii" >> "$ERRLIST" + test "$autosav" = "true" && cp "$outdir/$pattern.res" "sav/" else # no sav but empty res echo "[0k] $outdir/$pattern.res is empty" ok="$ok $pattern" fi - if test -s $outdir/$pattern.cmp.err; then + if test -s "$outdir/$pattern.cmp.err"; then echo >>$xml ">$xml $outdir/$pattern.cmp.err + cat -v >>$xml -- "$outdir/$pattern.cmp.err" echo >>$xml "]]>" fi echo >>$xml "" @@ -303,12 +399,33 @@ need_skip() test "$noskip" = true && return 1 if echo "$1" | grep -f "$engine.skip" >/dev/null 2>&1; then echo "=> $2: [skip]" - echo >>$xml "" + echo >>$xml "" return 0 fi if test -n "$isinterpret" && echo "$1" | grep -f "exec.skip" >/dev/null 2>&1; then echo "=> $2: [skip exec]" - echo >>$xml "" + echo >>$xml "" + return 0 + fi + if test -n "GITLAB_CI" && echo "$1" | grep -f "gitlab_ci.skip" >/dev/null 2>&1; then + echo "=> $2: [skip gitlab ci]" + echo >>$xml "" + return 0 + fi + + # Skip by OS + local os_skip_file=$UNAME.skip + if test -e $os_skip_file && echo "$1" | grep -f "$os_skip_file" >/dev/null 2>&1; then + echo "=> $2: [skip os]" + echo >>$xml "" + return 0 + fi + + # Skip by hostname + local host_skip_file=`$HOSTNAME`.skip + if test -e $host_skip_file && echo "$1" | grep -f "$host_skip_file" >/dev/null 2>&1; then + echo "=> $2: [skip hostname]" + echo >>$xml "" return 0 fi return 1 @@ -317,26 +434,48 @@ need_skip() skip_exec() { test "$noskip" = true && return 1 - if echo "$1" | grep -f "exec.skip" >/dev/null 2>&1; then - echo -n "_ " - return 0 - fi + for savdir in $savdirs .; do + local f="$savdir/exec.skip" + test -f "$f" || continue + if echo "$1" | grep -f "$f" >/dev/null 2>&1; then + echo -n "_ no exec by $f; " + return 0 + fi + done return 1 } skip_cc() { test "$noskip" = true && return 1 - if echo "$1" | grep -f "cc.skip" >/dev/null 2>&1; then - return 0 - fi + for savdir in $savdirs .; do + local f="$savdir/cc.skip" + test -f "$f" || continue + if echo "$1" | grep -f "$f" >/dev/null 2>&1; then + return 0 + fi + done + return 1 +} + +# Check that the resfile ($1) matches some magic strings in `todo` files. +istodo() +{ + test "$no" = true && return 1 + for savdir in $savdirs .; do + local f="$savdir/todo" + test -f "$f" || continue + if grep -f "$f" "$1" >/dev/null 2>&1; then + return 0 + fi + done return 1 } find_nitc() { - name="$enginebinname" - recent=`ls -t ../src/$name ../src/$name_[0-9] ../bin/$name ../c_src/$name 2>/dev/null | head -1` + local name="$enginebinname" + local recent=`ls -t ../src/$name ../src/$name_[0-9] ../bin/$name ../contrib/nitin/bin/$name ../c_src/$name 2>/dev/null | head -1` if [[ "x$recent" == "x" ]]; then echo "Could not find binary for engine $engine, aborting" exit 1 @@ -349,8 +488,9 @@ find_nitc() verbose=false isnode=false +autosav=false stop=false -engine=nitg +engine=nitc noskip= savdirs= while [ $stop = false ]; do @@ -363,32 +503,43 @@ while [ $stop = false ]; do --outdir) outdir="$2"; shift; shift;; --compdir) compdir="$2"; shift; shift;; --node) isnode=true; shift;; + --autosav) autosav=true; shift;; *) stop=true esac done enginebinname=$engine isinterpret= +isinteractive= case $engine in - nitg) - engine=nitg-s; - enginebinname=nitg; + nitc|nitg) + engine=nitcs; + enginebinname=nitc; OPT="--separate $OPT --compile-dir $compdir" + savdirs="sav/nitc-common/" ;; - nitg-s) - enginebinname=nitg; + nitcs|nitg-s) + engine=nitcs; + enginebinname=nitc; OPT="--separate $OPT --compile-dir $compdir" + savdirs="sav/nitc-common/" ;; - nitg-e) - enginebinname=nitg; + nitce|nitg-e) + engine=nitce; + enginebinname=nitc; OPT="--erasure $OPT --compile-dir $compdir" + savdirs="sav/nitc-common/" ;; - nitg-sg) - enginebinname=nitg; + nitcsg|nitg-sg) + engine=nitcsg; + enginebinname=nitc; OPT="--semi-global $OPT --compile-dir $compdir" + savdirs="sav/nitc-common/" ;; - nitg-g) - enginebinname=nitg; + nitcg|nitg-g) + engine=nitcg; + enginebinname=nitc; OPT="--global $OPT --compile-dir $compdir" + savdirs="sav/nitc-common/" ;; nit) engine=niti @@ -400,16 +551,24 @@ case $engine in ;; nitvm) isinterpret=true + enginebinname=nit + OPT="--vm $OPT" savdirs="sav/niti/" ;; + nitin) + enginebinname=nitin + isinteractive=true + ;; + nitj) + engine=nitj; + OPT="--compile-dir $compdir --ant" + enginebinname=nitj; + savdirs="sav/nitc-common/" + ;; emscripten) - enginebinname=nitg + enginebinname=nitc OPT="-m emscripten_nodejs.nit --semi-global $OPT --compile-dir $compdir" - savdirs="sav/nitg-sg/" - ;; - nitc) - echo "disabled engine $engine" - exit 0 + savdirs="sav/nitcsg/" ;; *) echo "unknown engine $engine" @@ -417,7 +576,8 @@ case $engine in ;; esac -savdirs="sav/$engine $savdirs sav/" +savdirs="sav/`$HOSTNAME` sav/$UNAME sav/$engine $savdirs sav/" +test -n "$GITLAB_CI" && savdirs="sav/gitlab_ci $savdirs" # The default nitc compiler [ -z "$NITC" ] && find_nitc @@ -457,36 +617,38 @@ todos="" if [ "x$XMLDIR" = "x" ]; then xml="tests-$engine.xml" else - xml="$XMLDIR/tests-$engine.xml" + sum=`echo $@ | md5sum | cut -f1 -d " "` + xml="$XMLDIR/tests-$engine-$sum.xml" + mkdir -p "$XMLDIR" fi echo >$xml "" for ii in "$@"; do - if [ ! -f $ii ]; then + if [ ! -f "$ii" ]; then echo "File '$ii' does not exist." continue fi - f=`basename "$ii" .nit` + f=`basename -- "$ii" .nit` pack="tests.${engine}".`echo $ii | perl -p -e 's|^../([^/]*)/([a-zA-Z_]*).*|\1.\2| || s|^([a-zA-Z]*)[^_]*_([a-zA-Z]*).*|\1.\2| || s|\W*([a-zA-Z_]*).*|\1|'` # Sould we skip the file for this engine? - need_skip $f $f $pack && continue + need_skip "$f" "$f" "$pack" && continue - tmp=${ii/../AA} - if [ "x$tmp" = "x$ii" ]; then - includes="-I . -I ../lib/standard -I ../lib/standard/collection -I alt" + local_tmp=${ii/../AA} + if [ "x$local_tmp" = "x$ii" ]; then + includes="-I . -I ../lib/core -I ../lib/core/collection -I alt" else includes="-I alt" fi - for i in "$ii" `./alterner.pl --start '#' --altsep '_' $ii`; do - bf=`basename $i .nit` + for i in "$ii" `./alterner.pl --start '#' --altsep '_' -- "$ii"`; do + bf=`basename -- "$i" .nit` ff="$outdir/$bf" # Sould we skip the alternative for this engine? - need_skip $bf $bf $pack && continue + need_skip "$bf" "$bf" "$pack" && continue echo -n "=> $bf: " @@ -505,7 +667,16 @@ for ii in "$@"; do if [ -n "$isinterpret" ]; then cat > "$ff.bin" < "$ff.cmp.err" + > "$ff.compile.log" + ERR=0 + echo 0.0 > "$ff.time.out" + elif [ -n "$isinteractive" ]; then + cat > "$ff.bin" < "$ff.cmp.err" @@ -521,39 +692,41 @@ END # Compile if [ "x$verbose" = "xtrue" ]; then echo "" - echo $NITC --no-color $OPT -o "$ffout" "$i" "$includes" $nocc + echo $NITC --no-color $OPT -o "$ffout" "$includes" $nocc "$i" fi NIT_NO_STACK=1 JNI_LIB_PATH=$JNI_LIB_PATH JAVA_HOME=$JAVA_HOME \ - saferun -o "$ff.time.out" $NITC --no-color $OPT -o "$ffout" "$i" $includes $nocc 2> "$ff.cmp.err" > "$ff.compile.log" + saferun -o "$ff.time.out" $NITC --no-color $OPT -o "$ffout" $includes $nocc "$i" 2> "$ff.cmp.err" > "$ff.compile.log" ERR=$? if [ "x$verbose" = "xtrue" ]; then - cat "$ff.compile.log" - cat >&2 "$ff.cmp.err" + cat -- "$ff.compile.log" + cat >&2 -- "$ff.cmp.err" fi + # Clean + rm -r "$compdir" 2>/dev/null fi if [ "$engine" = "emscripten" ]; then echo > "$ff.bin" "nodejs $ffout \"\$@\"" chmod +x "$ff.bin" if grep "Fatal Error: more than one primitive class" "$ff.compile.log" > /dev/null; then echo " [skip] do no not imports kernel" - echo >>$xml "" + echo >>$xml "" continue fi fi if [ "$ERR" != 0 ]; then echo -n "! " - cat "$ff.compile.log" "$ff.cmp.err" > "$ff.res" - process_result $bf $bf $pack + cat -- "$ff.compile.log" "$ff.cmp.err" > "$ff.res" + process_result "$bf" "$bf" "$pack" elif [ -n "$nocc" ]; then # not compiled echo -n "nocc " > "$ff.res" - process_result $bf $bf $pack + process_result "$bf" "$bf" "$pack" elif [ -x "$ff.bin" ]; then if skip_exec "$bf"; then # No exec > "$ff.res" - process_result $bf $bf $pack + process_result "$bf" "$bf" "$pack" break fi echo -n ". " @@ -563,23 +736,23 @@ END echo "" echo "NIT_NO_STACK=1 $ff.bin" $args fi - NIT_NO_STACK=1 LD_LIBRARY_PATH=$JNI_LIB_PATH \ + NIT_NO_STACK=1 LD_LIBRARY_PATH=$JNI_LIB_PATH WRITE="$ff.write" \ saferun -a -o "$ff.time.out" "$ff.bin" $args < "$inputs" > "$ff.res" 2>"$ff.err" - mv $ff.time.out $ff.times.out - awk '{ SUM += $1} END { print SUM }' $ff.times.out > $ff.time.out + mv "$ff.time.out" "$ff.times.out" + awk '{ SUM += $1} END { print SUM }' "$ff.times.out" > "$ff.time.out" if [ "x$verbose" = "xtrue" ]; then - cat "$ff.res" - cat >&2 "$ff.err" + cat -- "$ff.res" + cat >&2 -- "$ff.err" fi if [ -f "$ff.write" ]; then - cat "$ff.write" >> "$ff.res" + cat -- "$ff.write" >> "$ff.res" elif [ -d "$ff.write" ]; then - LANG=C /bin/ls -F $ff.write >> "$ff.res" + /bin/ls -F "$ff.write" >> "$ff.res" fi - cp "$ff.res" "$ff.res2" - cat "$ff.cmp.err" "$ff.err" "$ff.res2" > "$ff.res" - process_result $bf $bf $pack + cp -- "$ff.res" "$ff.res2" + cat -- "$ff.cmp.err" "$ff.err" "$ff.res2" > "$ff.res" + process_result "$bf" "$bf" "$pack" if [ -f "$f.args" ]; then fargs=$f.args @@ -592,13 +765,13 @@ END name="$bf args $cptr" # Sould we skip the input for this engine? - need_skip $bff " $name" $pack && continue + need_skip "$bff" " $name" "$pack" && continue # use a specific inputs file, if required if [ -f "$bff.inputs" ]; then ffinputs="$bff.inputs" else - ffinputs=$inputs + ffinputs="$inputs" fi rm -rf "$fff.res" "$fff.err" "$fff.write" 2> /dev/null @@ -611,30 +784,30 @@ END chmod +x "$fff.bin" WRITE="$fff.write" saferun -o "$fff.time.out" sh -c "NIT_NO_STACK=1 $fff.bin < $ffinputs > $fff.res 2>$fff.err" if [ "x$verbose" = "xtrue" ]; then - cat "$fff.res" - cat >&2 "$fff.err" + cat -- "$fff.res" + cat >&2 -- "$fff.err" fi if [ -f "$fff.write" ]; then - cat "$fff.write" >> "$fff.res" + cat -- "$fff.write" >> "$fff.res" elif [ -d "$fff.write" ]; then - LANG=C /bin/ls -F $fff.write >> "$fff.res" + /bin/ls -F -- "$fff.write" >> "$fff.res" fi if [ -s "$fff.err" ]; then - cp "$fff.res" "$fff.res2" - cat "$fff.err" "$fff.res2" > "$fff.res" + cp -- "$fff.res" "$fff.res2" + cat -- "$fff.err" "$fff.res2" > "$fff.res" fi - process_result $bff " $name" $pack - done < $fargs + process_result "$bff" " $name" "$pack" + done < "$fargs" fi elif [ -f "$ff.bin" ]; then #Not executable (platform?)" > "$ff.res" - process_result $bf "$bf" $pack + process_result "$bf" "$bf" "$pack" else echo -n "! " - cat "$ff.cmp.err" > "$ff.res" + cat -- "$ff.cmp.err" > "$ff.res" echo "Compilation error" > "$ff.res" - process_result $bf "$bf" $pack + process_result "$bf" "$bf" "$pack" fi done done @@ -669,6 +842,10 @@ fi echo >>$xml "" +if type junit2html >/dev/null; then + junit2html "$xml" +fi + if [ -n "$nok" ]; then exit 1 else