Commit cee92022 authored by David Symonds's avatar David Symonds

testing: capture panics, present them, and mark the test as a failure.

R=r
CC=golang-dev
https://golang.org/cl/5633044
parent e066db3a
......@@ -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
}()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment