From bf2838334c76312bb65c95e6cbdfa1d40c8e4074 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 14 Feb 2012 14:53:30 +1100 Subject: [PATCH] testing: let runtime catch the panic. 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. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 2 +- src/pkg/testing/testing.go | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/pkg/runtime/debug/stack_test.go b/src/pkg/runtime/debug/stack_test.go index f1a307579cf..cf4bd0238e7 100644 --- a/src/pkg/runtime/debug/stack_test.go +++ b/src/pkg/runtime/debug/stack_test.go @@ -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" diff --git a/src/pkg/testing/testing.go b/src/pkg/testing/testing.go index b60d5c1b0d4..bbacf8ba502 100644 --- a/src/pkg/testing/testing.go +++ b/src/pkg/testing/testing.go @@ -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. - if err := recover(); err != nil { - t.failed = true - t.Logf("%s\n%s", err, debug.Stack()) - } - t.duration = time.Now().Sub(t.start) + // If the test panicked, print any test output before dying. + if err := recover(); err != nil { + t.report() + panic(err) + } t.signal <- t }()