]> Cypherpunks repositories - gostls13.git/commitdiff
testing: add -test.timeout option.
authorIan Lance Taylor <iant@golang.org>
Thu, 31 Mar 2011 22:27:51 +0000 (15:27 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 31 Mar 2011 22:27:51 +0000 (15:27 -0700)
Since Go code can deadlock, this lets a testsuite driver set a
time limit for the test to run.  This is simple but imperfect,
in that it only catches deadlocks in Go code, not in the
runtime scheduler.

R=r, rsc, iant2
CC=golang-dev
https://golang.org/cl/4326048

src/Make.pkg
src/cmd/gotest/doc.go
src/cmd/gotest/flag.go
src/pkg/testing/testing.go

index 8eadb111cac32d312061b4d258593e7245b6caa4..99bea67b27193c3408661b91a0827cac38751f0d 100644 (file)
@@ -61,7 +61,7 @@ test:
        gotest
 
 testshort:
-       gotest -test.short
+       gotest -test.short -test.timeout=60
 
 bench:
        gotest -test.bench=. -test.run="Do not run tests"
index ad4a8a48c0371d5ab10e06f4a0fd0bc356e7a10b..0757ac49beedb69a3de8b64c42a22e10db42626d 100644 (file)
@@ -82,11 +82,15 @@ collection.
 Use -test.run or -test.bench to limit profiling to a particular test
 or benchmark.
 
-The -test.short package tells long-running tests to shorten their run
+The -test.short flag tells long-running tests to shorten their run
 time.  It is off by default but set by all.bash so installations of
 the Go tree can do a sanity check but not spend time running
 exhaustive tests.
 
+The -test.timeout flag sets a timeout for the test in seconds.  If the
+test runs for longer than that, it will panic, dumping a stack trace
+of all existing goroutines.
+
 For convenience, each of these -test.X flags of the test binary is
 also available as the flag -X in gotest itself.  Flags not listed here
 are unaffected.  For instance, the command
index 8e3f680f46b75a30ec29083733889761b63ae099..780c78b9c8efd0251e2683d020f6e348e168a55b 100644 (file)
@@ -28,6 +28,7 @@ var usageMessage = `Usage of %s:
   -memprofilerate=0: passes -test.memprofilerate to test
   -run="": passes -test.run to test
   -short=false: passes -test.short to test
+  -timeout=0: passes -test.timeout to test
   -v=false: passes -test.v to test
 `
 
@@ -60,6 +61,7 @@ var flagDefn = []*flagSpec{
        &flagSpec{name: "memprofilerate", passToTest: true},
        &flagSpec{name: "run", passToTest: true},
        &flagSpec{name: "short", isBool: true, passToTest: true},
+       &flagSpec{name: "timeout", passToTest: true},
        &flagSpec{name: "v", isBool: true, passToTest: true},
 }
 
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")
+}