From: David Symonds Date: Mon, 6 Feb 2012 03:00:23 +0000 (+1100) Subject: testing: capture panics, present them, and mark the test as a failure. X-Git-Tag: weekly.2012-02-07~54 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cee920225ddaec164c0026480e072e0ea568db40;p=gostls13.git testing: capture panics, present them, and mark the test as a failure. R=r CC=golang-dev https://golang.org/cl/5633044 --- diff --git a/src/pkg/testing/testing.go b/src/pkg/testing/testing.go index f1acb97e1b..68ecebb36f 100644 --- a/src/pkg/testing/testing.go +++ b/src/pkg/testing/testing.go @@ -225,6 +225,19 @@ func (c *common) Fatalf(format string, args ...interface{}) { c.FailNow() } +// TODO(dsymonds): Consider hooking into runtime·traceback instead. +func (c *common) stack() { + for i := 2; ; i++ { // Caller we care about is the user, 2 frames up + pc, file, line, ok := runtime.Caller(i) + f := runtime.FuncForPC(pc) + if !ok || f == nil { + break + } + c.Logf("%s:%d (0x%x)", file, line, pc) + c.Logf("\t%s", f.Name()) + } +} + // Parallel signals that this test is to be run in parallel with (and only with) // other parallel tests in this CPU group. func (t *T) Parallel() { @@ -247,6 +260,13 @@ 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() { + // Consider any uncaught panic a failure. + if err := recover(); err != nil { + t.failed = true + t.Log(err) + t.stack() + } + t.duration = time.Now().Sub(t.start) t.signal <- t }()