From 85f2b59c4459e5bf57488796be8c3667cb8246d6 Mon Sep 17 00:00:00 2001 From: Daniel Cormier Date: Mon, 16 Jul 2018 10:42:29 -0400 Subject: [PATCH] Add panic stack to output from NotPanics assertion failures --- assert/assertions.go | 17 ++++++++++------- assert/assertions_test.go | 4 ++-- assert/forward_assertions_test.go | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/assert/assertions.go b/assert/assertions.go index 044da8b..de7afe1 100644 --- a/assert/assertions.go +++ b/assert/assertions.go @@ -11,6 +11,7 @@ import ( "reflect" "regexp" "runtime" + "runtime/debug" "strings" "time" "unicode" @@ -901,15 +902,17 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { type PanicTestFunc func() // didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}) { +func didPanic(f PanicTestFunc) (bool, interface{}, string) { didPanic := false var message interface{} + var stack string func() { defer func() { if message = recover(); message != nil { didPanic = true + stack = string(debug.Stack()) } }() @@ -918,7 +921,7 @@ func didPanic(f PanicTestFunc) (bool, interface{}) { }() - return didPanic, message + return didPanic, message, stack } @@ -930,7 +933,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } @@ -946,12 +949,12 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr h.Helper() } - funcDidPanic, panicValue := didPanic(f) + funcDidPanic, panicValue, panickedStack := didPanic(f) if !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v", f, expected, panicValue), msgAndArgs...) + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...) } return true @@ -965,8 +968,8 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v", f, panicValue), msgAndArgs...) + if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...) } return true diff --git a/assert/assertions_test.go b/assert/assertions_test.go index a4a9585..b5e4635 100644 --- a/assert/assertions_test.go +++ b/assert/assertions_test.go @@ -730,13 +730,13 @@ func TestCondition(t *testing.T) { func TestDidPanic(t *testing.T) { - if funcDidPanic, _ := didPanic(func() { + if funcDidPanic, _, _ := didPanic(func() { panic("Panic!") }); !funcDidPanic { t.Error("didPanic should return true") } - if funcDidPanic, _ := didPanic(func() { + if funcDidPanic, _, _ := didPanic(func() { }); funcDidPanic { t.Error("didPanic should return false") } diff --git a/assert/forward_assertions_test.go b/assert/forward_assertions_test.go index 4d83d6a..60e5e30 100644 --- a/assert/forward_assertions_test.go +++ b/assert/forward_assertions_test.go @@ -212,13 +212,13 @@ func TestConditionWrapper(t *testing.T) { func TestDidPanicWrapper(t *testing.T) { - if funcDidPanic, _ := didPanic(func() { + if funcDidPanic, _, _ := didPanic(func() { panic("Panic!") }); !funcDidPanic { t.Error("didPanic should return true") } - if funcDidPanic, _ := didPanic(func() { + if funcDidPanic, _, _ := didPanic(func() { }); funcDidPanic { t.Error("didPanic should return false") }