summaryrefslogtreecommitdiff
path: root/libgo/go/testing/testing.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/testing/testing.go')
-rw-r--r--libgo/go/testing/testing.go20
1 files changed, 20 insertions, 0 deletions
diff --git a/libgo/go/testing/testing.go b/libgo/go/testing/testing.go
index f1acb97e1b6..68ecebb36f4 100644
--- a/libgo/go/testing/testing.go
+++ b/libgo/go/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
}()