X-Git-Url: http://nitlanguage.org diff --git a/tests/tests.sh b/tests/tests.sh index 9ac0ef7..6cfb9be 100755 --- a/tests/tests.sh +++ b/tests/tests.sh @@ -19,8 +19,22 @@ # Set lang do default to avoid failed tests because of locale export LANG=C +export LC_ALL=C export NIT_TESTING=true +unset NIT_DIR + +# Get the first Java lib available +shopt -s nullglob +paths=`echo /usr/lib/jvm/*/` +paths=($paths) +JAVA_HOME=${paths[0]} + +paths=`echo $JAVA_HOME/jre/lib/*/{client,server}/` +paths=($paths) +JNI_LIB_PATH=${paths[0]} +shopt -u nullglob + usage() { e=`basename "$0"` @@ -29,10 +43,8 @@ Usage: $e [options] modulenames -o option Pass option to the engine -v Verbose (show tests steps) -h This help ---tap Produce TAP output ---engine Use a specific engine (default=nitc) +--engine Use a specific engine (default=nitg) --noskip Do not skip a test even if the .skip file matches ---[no]soso Force enable (or disable) SOSO END } @@ -48,16 +60,16 @@ function compare_to_result() local pattern="$1" local sav="$2" if [ ! -r "$sav" ]; then return 0; fi - diff -u "out/$pattern.res" "$sav" > "out/$pattern.diff.sav.log" + test "`cat "$sav"`" = "UNDEFINED" && return 1 + diff -u "$sav" "out/$pattern.res" > "out/$pattern.diff.sav.log" if [ "$?" == 0 ]; then return 1 fi - [ -z "$soso" ] && return 3 sed '/[Ww]arning/d;/[Ee]rror/d' "out/$pattern.res" > "out/$pattern.res2" sed '/[Ww]arning/d;/[Ee]rror/d' "$sav" > "out/$pattern.sav2" grep '[Ee]rror' "out/$pattern.res" >/dev/null && echo "Error" >> "out/$pattern.res2" grep '[Ee]rror' "$sav" >/dev/null && echo "Error" >> "out/$pattern.sav2" - diff -u "out/$pattern.res2" "out/$pattern.sav2" > "out/$pattern.diff.sav2.log" + diff -u "out/$pattern.sav2" "out/$pattern.res2" > "out/$pattern.diff.sav.log2" if [ "$?" == 0 ]; then return 2 else @@ -68,10 +80,10 @@ function compare_to_result() # As argument: the pattern used for the file function process_result() { - ((tapcount=tapcount+1)) # Result pattern=$1 description=$2 + pack=$3 SAV="" NSAV="" FIXME="" @@ -80,107 +92,172 @@ function process_result() NSOSO="" SOSOF="" NSOSOF="" - for sav in "sav/$engine/$pattern.res" "sav/$pattern.res" "sav/$pattern.sav"; do + OLD="" + LIST="" + FIRST="" + 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 compare_to_result "$pattern" "$sav" case "$?" in 0) ;; # no file 1) - SAV="$sav" ;; + OLD="$LIST" + FIXME="$sav" + LIST="$LIST $sav" + ;; 2) - SOSO="$sav" ;; + if [ -z "$FIRST" ]; then + SOSOF="$sav" + FIRST="$sav" + fi + LIST="$LIST $sav" + ;; 3) - NSAV="$sav";; + if [ -z "$FIRST" ]; then + NFIXME="$sav" + FIRST="$sav" + fi + LIST="$LIST $sav" + ;; esac - done - for sav in "sav/$engine/fixme/$pattern.res" "sav/fixme/$pattern.res" "sav/$pattern.fail"; do + + sav=$savdir/$pattern.res compare_to_result "$pattern" "$sav" case "$?" in 0) ;; # no file 1) - FIXME="$sav" ;; + OLD="$LIST" + SAV="$sav" + LIST="$LIST $sav" + ;; 2) - SOSOF="$sav" ;; + if [ -z "$FIRST" ]; then + SOSO="$sav" + FIRST="$sav" + fi + LIST="$LIST $sav" + ;; 3) - NFIXME="$sav";; + if [ -z "$FIRST" ]; then + NSAV="$sav" + FIRST="$sav" + fi + LIST="$LIST $sav" + ;; esac done + OLD=`echo "$OLD" | sed -e 's/ */ /g' -e 's/^ //' -e 's/ $//'` grep 'NOT YET IMPLEMENTED' "out/$pattern.res" >/dev/null NYI="$?" if [ -n "$SAV" ]; then - if [ -n "$tap" ]; then - echo "ok - $description" - elif [ -z "$FIXME" ]; then - echo "[ok] out/$pattern.res $SAV" + if [ -n "$OLD" ]; then + echo "[*ok*] out/$pattern.res $SAV - but $OLD remains!" + echo >>$xml "" + remains="$remains $OLD" else - echo "[ok] out/$pattern.res $SAV - but $FIXME remains!" + echo "[ok] out/$pattern.res $SAV" fi ok="$ok $pattern" elif [ -n "$FIXME" ]; then - if [ -n "$tap" ]; then - echo "not ok - $description # TODO expected failure" + if [ -n "$OLD" ]; then + echo "[*fixme*] out/$pattern.res $FIXME - but $OLD remains!" + echo >>$xml "" + remains="$remains $OLD" else echo "[fixme] out/$pattern.res $FIXME" + echo >>$xml "" fi todos="$todos $pattern" - elif [ -n "$SOSO" ]; then - if [ -n "$tap" ]; then - echo "ok - $description # SOSO" - else - echo "[soso] out/$pattern.res $SOSO" - fi - ok="$ok $pattern" elif [ "x$NYI" = "x0" ]; then - if [ -n "$tap" ]; then - echo "not ok - $description # TODO not yet implemented" - else - echo "[todo] out/$pattern.res -> not yet implemented" - fi + echo "[todo] out/$pattern.res -> not yet implemented" + echo >>$xml "" todos="$todos $pattern" + elif [ -n "$SOSO" ]; then + echo "[======= soso out/$pattern.res $SOSO =======]" + echo >>$xml "" + echo >>$xml ">$xml -n 50 + echo >>$xml "]]>" + nok="$nok $pattern" + echo "$ii" >> "$ERRLIST" elif [ -n "$SOSOF" ]; then - if [ -n "$tap" ]; then - echo "not ok - $description # TODO SOSO expected failure" - else - echo "[fixme soso] out/$pattern.res $SOSOF" - fi - todos="$todos $pattern" + echo "[======= fixme soso out/$pattern.res $SOSOF =======]" + echo >>$xml "" + echo >>$xml ">$xml -n 50 + echo >>$xml "]]>" + nok="$nok $pattern" + echo "$ii" >> "$ERRLIST" elif [ -n "$NSAV" ]; then - if [ -n "$tap" ]; then - echo "not ok - $description" - else - echo "[======= fail out/$pattern.res $NSAV =======]" - fi + echo "[======= fail out/$pattern.res $NSAV =======]" + echo >>$xml "" + echo >>$xml ">$xml -n 50 + echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" elif [ -n "$NFIXME" ]; then - if [ -n "$tap" ]; then - echo "not ok - $description" - else - echo "[======= changed out/$pattern.res $NFIXME ======]" - fi + echo "[======= changed out/$pattern.res $NFIXME ======]" + echo >>$xml "" + echo >>$xml ">$xml -n 50 + echo >>$xml "]]>" nok="$nok $pattern" echo "$ii" >> "$ERRLIST" - else - if [ -n "$tap" ]; then - echo "ok - $description # skip no sav" - else - echo "[=== no sav ===] out/$pattern.res" - fi + elif [ -s out/$pattern.res ]; then + echo "[=== no sav ===] out/$pattern.res is not empty" + echo >>$xml "" + echo >>$xml ">$xml out/$pattern.res + echo >>$xml "]]>" nos="$nos $pattern" + else + # no sav but empty res + echo "[0k] out/$pattern.res is empty" + ok="$ok $pattern" + fi + if test -s out/$pattern.cmp.err; then + echo >>$xml ">$xml out/$pattern.cmp.err + echo >>$xml "]]>" fi + echo >>$xml "" } need_skip() { test "$noskip" = true && return 1 if echo "$1" | grep -f "$engine.skip" >/dev/null 2>&1; then - ((tapcount=tapcount+1)) - if [ -n "$tap" ]; then - echo "ok - $2 # skip" - else - echo "=> $2: [skip]" - fi + echo "=> $2: [skip]" + echo >>$xml "" + return 0 + fi + if test $engine = niti && echo "$1" | grep -f "exec.skip" >/dev/null 2>&1; then + echo "=> $2: [skip exec]" + echo >>$xml "" + return 0 + fi + return 1 +} + +skip_exec() +{ + test "$noskip" = true && return 1 + if echo "$1" | grep -f "exec.skip" >/dev/null 2>&1; then + echo -n "_ " + return 0 + fi + return 1 +} + +skip_cc() +{ + test "$noskip" = true && return 1 + if echo "$1" | grep -f "cc.skip" >/dev/null 2>&1; then return 0 fi return 1 @@ -188,54 +265,77 @@ need_skip() find_nitc() { - ((tapcount=tapcount+1)) name="$enginebinname" recent=`ls -t ../src/$name ../src/$name_[0-9] ../bin/$name ../c_src/$name 2>/dev/null | head -1` if [[ "x$recent" == "x" ]]; then - if [ -n "$tap" ]; then - echo "not ok - find engine $name" - echo "Bail out! Could not find engine $name, aborting" - else - echo "Could not find engine $name, aborting" - fi + echo "Could not find binary for engine $engine, aborting" exit 1 fi - if [ -n "$tap" ]; then - echo "ok - find engine $name: $recent" - else - echo "Using engine $name from: $recent" - fi + echo "Find binary for engine $engine: $recent $OPT" NITC=$recent } verbose=false stop=false -tapcount=0 -engine=nitc +engine=nitg noskip= +savdirs= while [ $stop = false ]; do case $1 in -o) OPT="$OPT $2"; shift; shift;; -v) verbose=true; shift;; -h) usage; exit;; - --tap) tap=true; shift;; --engine) engine="$2"; shift; shift;; --noskip) noskip=true; shift;; - --soso) soso=true; shift;; - --nososo) nososo=true; shift;; *) stop=true esac done enginebinname=$engine case $engine in - nitc) ;; - nitg) ;; - nitg-s) enginebinname=nitg; OPT="--separate $OPT";; - nitg-e) enginebinname=nitg; OPT="--erasure $OPT";; - nit) engine=niti ;; - niti) enginebinname=nit ;; + nitg) + engine=nitg-s; + enginebinname=nitg; + OPT="--separate $OPT" + ;; + nitg-s) + enginebinname=nitg; + OPT="--separate $OPT" + ;; + nitg-e) + enginebinname=nitg; + OPT="--erasure $OPT" + ;; + nitg-sg) + enginebinname=nitg; + OPT="--semi-global $OPT" + ;; + nitg-g) + enginebinname=nitg; + OPT="--global $OPT" + ;; + nit) + engine=niti + ;; + niti) + enginebinname=nit + ;; + emscripten) + enginebinname=nitg + OPT="-m emscripten_nodejs.nit --semi-global $OPT" + savdirs="sav/nitg-sg/" + ;; + nitc) + echo "disabled engine $engine" + exit 0 + ;; + *) + echo "unknown engine $engine" + exit 1 + ;; esac +savdirs="sav/$engine $savdirs sav/" + # The default nitc compiler [ -z "$NITC" ] && find_nitc @@ -274,6 +374,8 @@ fi ok="" nok="" todos="" +xml="tests-$engine.xml" +echo >$xml "" # CLEAN the out directory rm -rf out/ 2>/dev/null @@ -286,8 +388,10 @@ for ii in "$@"; do fi f=`basename "$ii" .nit` + pack=`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 && continue + need_skip $f $f $pack && continue tmp=${ii/../AA} if [ "x$tmp" = "x$ii" ]; then @@ -301,9 +405,9 @@ for ii in "$@"; do ff="out/$bf" # Sould we skip the alternative for this engine? - need_skip $bf $bf && continue + need_skip $bf $bf $pack && continue - test -z "$tap" && echo -n "=> $bf: " + echo -n "=> $bf: " if [ -f "$f.inputs" ]; then inputs="$f.inputs" @@ -311,6 +415,11 @@ for ii in "$@"; do inputs=/dev/null fi + ffout="$ff.bin" + if [ "$engine" = "emscripten" ]; then + ffout="$ff.bin.js" + fi + if [ "$engine" = "niti" ]; then cat > "./$ff.bin" < "$ff.compile.log" ERR=0 else + if skip_cc "$bf"; then + nocc="--no-cc" + else + nocc= + fi # Compile if [ "x$verbose" = "xtrue" ]; then echo "" - echo $NITC --no-color $OPT -o "$ff.bin" "$i" "$includes" + echo $NITC --no-color $OPT -o "$ffout" "$i" "$includes" $nocc fi - NIT_NO_STACK=1 $TIMEOUT $NITC --no-color $OPT -o "$ff.bin" "$i" $includes 2> "$ff.cmp.err" > "$ff.compile.log" + NIT_NO_STACK=1 JNI_LIB_PATH=$JNI_LIB_PATH JAVA_HOME=$JAVA_HOME \ + $TIMEOUT $NITC --no-color $OPT -o "$ffout" "$i" $includes $nocc 2> "$ff.cmp.err" > "$ff.compile.log" ERR=$? if [ "x$verbose" = "xtrue" ]; then cat "$ff.compile.log" cat >&2 "$ff.cmp.err" fi 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 "" + continue + fi + fi if [ "$ERR" != 0 ]; then - test -z "$tap" && echo -n "! " + echo -n "! " cat "$ff.compile.log" "$ff.cmp.err" > "$ff.res" - process_result $bf $bf + process_result $bf $bf $pack + elif skip_exec "$bf"; then + # No exec + > "$ff.res" + process_result $bf $bf $pack + elif [ -n "$nocc" ]; then + # not compiled + echo -n "nocc " + > "$ff.res" + process_result $bf $bf $pack elif [ -x "./$ff.bin" ]; then - test -z "$tap" && echo -n ". " + echo -n ". " # Execute args="" if [ "x$verbose" = "xtrue" ]; then echo "" echo "NIT_NO_STACK=1 ./$ff.bin" $args - fi - NIT_NO_STACK=1 $TIMEOUT "./$ff.bin" $args < "$inputs" > "$ff.res" 2>"$ff.err" + fi + NIT_NO_STACK=1 LD_LIBRARY_PATH=$JNI_LIB_PATH \ + $TIMEOUT "./$ff.bin" $args < "$inputs" > "$ff.res" 2>"$ff.err" if [ "x$verbose" = "xtrue" ]; then cat "$ff.res" cat >&2 "$ff.err" @@ -356,7 +490,7 @@ END fi cp "$ff.res" "$ff.res2" cat "$ff.cmp.err" "$ff.err" "$ff.res2" > "$ff.res" - process_result $bf $bf + process_result $bf $bf $pack if [ -f "$f.args" ]; then fargs=$f.args @@ -366,19 +500,27 @@ END args="$line" bff=$bf"_args"$cptr fff=$ff"_args"$cptr + name="$bf args $cptr" # Sould we skip the input for this engine? - need_skip $bff " args #$cptr" && 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 + fi rm -rf "$fff.res" "$fff.err" "$fff.write" 2> /dev/null if [ "x$verbose" = "xtrue" ]; then echo "" echo "NIT_NO_STACK=1 ./$ff.bin" $args fi - test -z "$tap" && echo -n "==> args #"$cptr " " + echo -n "==> $name " echo "./$ff.bin $args" > "./$fff.bin" chmod +x "./$fff.bin" - sh -c "NIT_NO_STACK=1 $TIMEOUT ./$fff.bin < $inputs > $fff.res 2>$fff.err" + WRITE="$fff.write" sh -c "NIT_NO_STACK=1 $TIMEOUT ./$fff.bin < $ffinputs > $fff.res 2>$fff.err" if [ "x$verbose" = "xtrue" ]; then cat "$fff.res" cat >&2 "$fff.err" @@ -392,27 +534,22 @@ END cp "$fff.res" "$fff.res2" cat "$fff.err" "$fff.res2" > "$fff.res" fi - process_result $bff " args #$cptr" + process_result $bff " $name" $pack done < $fargs fi + elif [ -f "./$ff.bin" ]; then + echo "Not executable (platform?)" > "$ff.res" + process_result $bf "$bf" $pack else - test -z "$tap" && echo -n "! " + echo -n "! " cat "$ff.cmp.err" > "$ff.res" echo "Compilation error" > "$ff.res" - process_result $bf "$bf" + process_result $bf "$bf" $pack fi done done -if [ -n "$tap" ]; then - echo "1..$tapcount" - echo "# ok:" `echo $ok | wc -w` - echo "# not ok:" `echo $nok | wc -w` - echo "# no sav:" `echo $nos | wc -w` - echo "# todo/fixme:" `echo $todos | wc -w` - exit -fi - +echo "engine: $engine ($enginebinname $OPT)" echo "ok: " `echo $ok | wc -w` "/" `echo $ok $nok $nos $todos | wc -w` if [ -n "$nok" ]; then @@ -425,6 +562,9 @@ fi if [ -n "$todos" ]; then echo "todo/fixme: $todos" fi +if [ -n "$remains" ]; then + echo "sav that remains: $remains" +fi # write $ERRLIST if [ "x$ERRLIST" != "x" ]; then @@ -434,6 +574,8 @@ if [ "x$ERRLIST" != "x" ]; then mv $ERRLIST $ERRLIST_TARGET fi +echo >>$xml "" + if [ -n "$nok" ]; then exit 1 else