re PR go/48242 (gotest needs timeout mechanism)
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 31 Mar 2011 22:36:10 +0000 (22:36 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 31 Mar 2011 22:36:10 +0000 (22:36 +0000)
PR go/48242
libgo: Add timeout for tests.

From-SVN: r171803

libgo/go/testing/testing.go
libgo/testsuite/gotest

index d1893907a565131fa43af76e8315793cc383570c..6d303cc6f2cd86de8a6f2e45ad1ed8fed0da8c05 100644 (file)
@@ -61,6 +61,7 @@ var (
        memProfile     = flag.String("test.memprofile", "", "write a memory profile to the named file after execution")
        memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate")
        cpuProfile     = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution")
+       timeout        = flag.Int64("test.timeout", 0, "if > 0, sets time limit for tests in seconds")
 )
 
 // Short reports whether the -test.short flag is set.
@@ -158,7 +159,9 @@ func Main(matchString func(pat, str string) (bool, os.Error), tests []InternalTe
        flag.Parse()
 
        before()
+       startAlarm()
        RunTests(matchString, tests)
+       stopAlarm()
        RunBenchmarks(matchString, benchmarks)
        after()
 }
@@ -241,3 +244,24 @@ func after() {
                f.Close()
        }
 }
+
+var timer *time.Timer
+
+// startAlarm starts an alarm if requested.
+func startAlarm() {
+       if *timeout > 0 {
+               timer = time.AfterFunc(*timeout*1e9, alarm)
+       }
+}
+
+// stopAlarm turns off the alarm.
+func stopAlarm() {
+       if *timeout > 0 {
+               timer.Stop()
+       }
+}
+
+// alarm is called if the timeout expires.
+func alarm() {
+       panic("test timed out")
+}
index bcd725136b9c38a0fabe516eeaa7dc65f202f036..517c0e9f23e6d167293dedd6835a6b45c3b4a591 100755 (executable)
@@ -32,6 +32,7 @@ loop=true
 keep=false
 prefix=
 dejagnu=no
+timeout=60
 while $loop; do
        case "x$1" in
         x--srcdir)
@@ -83,6 +84,15 @@ while $loop; do
                dejagnu=`echo $1 | sed -e 's/^--dejagnu=//'`
                shift
                ;;
+       x--timeout)
+               timeout=$2
+               shift
+               shift
+               ;;
+       x--timeout=*)
+               timeout=`echo $1 | sed -e 's/^--timeout=//'`
+               shift
+               ;;
        x-*)
                loop=false
                ;;
@@ -357,7 +367,7 @@ case "x$dejagnu" in
 xno)
        ${GC} -g -c _testmain.go
        ${GL} *.o ${GOLIBS}
-       ./a.out -test.short "$@"
+       ./a.out -test.short -test.timeout=$timeout "$@"
        ;;
 xyes)
        rm -rf ../testsuite/*.o