]> Cypherpunks repositories - gostls13.git/commitdiff
testing: let runtime catch the panic.
authorRob Pike <r@golang.org>
Tue, 14 Feb 2012 03:53:30 +0000 (14:53 +1100)
committerRob Pike <r@golang.org>
Tue, 14 Feb 2012 03:53:30 +0000 (14:53 +1100)
It's not as pretty, but it deletes some irrelevant information from the
printout and avoids a dependency.
It also means the test binary will stop if a test panics. That's a feature,
not a bug.
Any output printed by the test appears before the panic traceback.

before:

--- FAIL: TestPanic (0.00 seconds)
        fmt_test.go:19: HI
        testing.go:257: runtime error: index out of range
                /Users/r/go/src/pkg/testing/testing.go:257 (0x23998)
                        _func_003: t.Logf("%s\n%s", err, debug.Stack())
                /Users/r/go/src/pkg/runtime/proc.c:1388 (0x10d2d)
                        panic: reflect·call(d->fn, d->args, d->siz);
                /Users/r/go/src/pkg/runtime/runtime.c:128 (0x119b0)
                        panicstring: runtime·panic(err);
                /Users/r/go/src/pkg/runtime/runtime.c:85 (0x11857)
                        panicindex: runtime·panicstring("index out of range");
                /Users/r/go/src/pkg/fmt/fmt_test.go:21 (0x23d72)
                        TestPanic: a[10]=1
                /Users/r/go/src/pkg/testing/testing.go:264 (0x21b75)
                        tRunner: test.F(t)
                /Users/r/go/src/pkg/runtime/proc.c:258 (0xee9e)
                        goexit: runtime·goexit(void)
FAIL

after:

--- FAIL: TestPanic (0.00 seconds)
        fmt_test.go:19: HI
panic: runtime error: index out of range [recovered]
        panic: (*testing.T) (0xec3b0,0xf8400001c0)

goroutine 2 [running]:
testing._func_003(0x21f5fa8, 0x21f5100, 0x21f5fb8, 0x21f5e88)
        /Users/r/go/src/pkg/testing/testing.go:259 +0x108
----- stack segment boundary -----
fmt_test.TestPanic(0xf8400001c0, 0x27603728)
        /Users/r/go/src/pkg/fmt/fmt_test.go:21 +0x6b
testing.tRunner(0xf8400001c0, 0x18edb8, 0x0, 0x0)
        /Users/r/go/src/pkg/testing/testing.go:264 +0x6f
created by testing.RunTests
        /Users/r/go/src/pkg/testing/testing.go:343 +0x76e

goroutine 1 [chan receive]:
testing.RunTests(0x2000, 0x18edb8, 0x2400000024, 0x100000001, 0x200000001, ...)
        /Users/r/go/src/pkg/testing/testing.go:344 +0x791
testing.Main(0x2000, 0x18edb8, 0x2400000024, 0x188a58, 0x800000008, ...)
        /Users/r/go/src/pkg/testing/testing.go:275 +0x62
main.main()
        /var/folders/++/+++Fn+++6+0++4RjPqRgNE++2Qk/-Tmp-/go-build743922747/fmt/_test/_testmain.go:129 +0x91
exit status 2

R=rsc, dsymonds
CC=golang-dev
https://golang.org/cl/5658048

src/pkg/runtime/debug/stack_test.go
src/pkg/testing/testing.go

index f1a307579cff7b6334130d0dab6ef5d48328608e..cf4bd0238e74f514d77c6f1e2c3c217b6d2fb7ec 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package debug_test
+package debug
 
 import (
        . "runtime/debug"
index b60d5c1b0d4b553637f853e7e474bd6e1990f0f6..bbacf8ba502fb848bf1c844d2438930fec9e43e2 100644 (file)
@@ -71,7 +71,6 @@ import (
        "fmt"
        "os"
        "runtime"
-       "runtime/debug"
        "runtime/pprof"
        "strconv"
        "strings"
@@ -248,13 +247,12 @@ func tRunner(t *T, test *InternalTest) {
        // a call to runtime.Goexit, record the duration and send
        // a signal saying that the test is done.
        defer func() {
-               // Log and recover from panic instead of aborting binary.
+               t.duration = time.Now().Sub(t.start)
+               // If the test panicked, print any test output before dying.
                if err := recover(); err != nil {
-                       t.failed = true
-                       t.Logf("%s\n%s", err, debug.Stack())
+                       t.report()
+                       panic(err)
                }
-
-               t.duration = time.Now().Sub(t.start)
                t.signal <- t
        }()