| #!/usr/bin/env bash | |
| # Copyright 2009 The Go Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style | |
| # license that can be found in the LICENSE file. | |
| eval $(gomake --no-print-directory -f ../src/Make.inc go-env) | |
| export E= | |
| case X"$GOARCH" in | |
| Xamd64) | |
| export A=6 | |
| ;; | |
| X386) | |
| export A=8 | |
| ;; | |
| Xarm) | |
| export A=5 | |
| export E="$GORUN" | |
| ;; | |
| *) | |
| echo 1>&2 run: unsupported '$GOARCH' | |
| exit 1 | |
| esac | |
| export G="${A}g ${GCFLAGS}" | |
| export L=${A}l | |
| export GOTRACEBACK=0 | |
| export LANG=C | |
| unset GREP_OPTIONS # in case user has a non-standard set | |
| failed=0 | |
| PATH=${GOBIN:-$GOROOT/bin}:`pwd`:/bin:/usr/bin:/usr/local/bin | |
| RUNFILE="/tmp/gorun-$$-$USER" | |
| TMP1FILE="/tmp/gotest1-$$-$USER" | |
| TMP2FILE="/tmp/gotest2-$$-$USER" | |
| # don't run the machine out of memory: limit individual processes to 4GB. | |
| # on thresher, 3GB suffices to run the tests; with 2GB, peano fails. | |
| ulimit -v 4000000 | |
| # no core files please | |
| ulimit -c 0 | |
| true >pass.out >times.out | |
| exclude=false # exclude nothing | |
| golden=golden.out | |
| filterout() { | |
| grep '^'"$2"'$' $1 >/dev/null | |
| } | |
| for dir in . ken chan interface syntax dwarf fixedbugs bugs | |
| do | |
| echo | |
| echo '==' $dir'/' | |
| for i in $(ls $dir/*.go 2>/dev/null) | |
| do ( | |
| if $exclude $i; then | |
| exit 0 # continues for loop | |
| fi | |
| export F=$(basename $i .go) | |
| export D=$dir | |
| sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|g' >"$RUNFILE" | |
| if ! { time -p bash -c "bash '$RUNFILE' >'$TMP1FILE' 2>&1" ; } 2>"$TMP2FILE" | |
| then | |
| echo | |
| echo "===========" $i | |
| cat "$TMP1FILE" | |
| echo >&2 fail: $i | |
| echo "# $i # fail" >>pass.out | |
| elif test -s "$TMP1FILE" | |
| then | |
| echo | |
| echo "===========" $i | |
| cat "$TMP1FILE" | |
| if grep -q '^BUG' "$TMP1FILE" | |
| then | |
| if [ $dir != bugs ] | |
| then | |
| echo >&2 bug: $i | |
| fi | |
| echo "# $i # fail, BUG" >>pass.out | |
| else | |
| echo $i >>pass.out | |
| fi | |
| elif [ $dir = "bugs" ] | |
| then | |
| echo $i succeeded with no output. | |
| else | |
| echo $i >>pass.out | |
| fi | |
| echo $(awk 'NR==1{print $2}' "$TMP2FILE") $D/$F >>times.out | |
| rm -f $F.$A $A.out | |
| ) done | |
| done | # clean up some stack noise | |
| egrep -v '^(r[0-9a-z]+|[cfg]s) +0x' | | |
| sed '/tmp.*Bus error/s/.*Bus/Bus/; /tmp.*Trace.BPT/s/.*Trace/Trace/ | |
| s!'"$RUNFILE"'!$RUNFILE!g | |
| s/^PC=0x[0-9a-f]*/pc: xxx/ | |
| s/^pc: 0x[0-9a-f]*/pc: xxx/ | |
| s/PC=0x[0-9a-f]*/PC=xxx/ | |
| /^Trace\/breakpoint trap/d | |
| /^Trace\/BPT trap/d | |
| /RUNFILE/ s/line 1: *[0-9]*/line 1: PID/ | |
| /^\$RUNFILE: line 1: PID Trace\/breakpoint trap/d | |
| /Segmentation fault/d | |
| /^qemu: uncaught target signal 11 (Segmentation fault) - exiting/d' > run.out | |
| rm -f "$RUNFILE" "$TMP1FILE" "$TMP2FILE" *.$A *.a $A.out | |
| diffmsg="" | |
| if ! diff $golden run.out | |
| then | |
| diffmsg="; test output differs" | |
| failed=1 | |
| fi | |
| notinbugs=$(sed '/^== bugs/q' run.out | grep -c '^BUG') | |
| inbugs=$(sed '1,/^== bugs/d' run.out | grep -c '^BUG') | |
| echo 2>&1 $inbugs known bugs';' $notinbugs unexpected bugs$diffmsg | |
| if [ "$failed" != "0" ]; then | |
| echo FAILED | |
| fi | |
| exit $failed |