From 99c9dd8c971833994231e6256f3c90e4b638d54f Mon Sep 17 00:00:00 2001 From: cszczepaniak Date: Tue, 6 Jun 2023 20:43:46 -0500 Subject: [PATCH] add GetStack and tests to stackerr pkg --- cmd/mockery.go | 10 +++----- pkg/stackerr/stackerr.go | 11 +++++++++ pkg/stackerr/stackerr_test.go | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 pkg/stackerr/stackerr_test.go diff --git a/cmd/mockery.go b/cmd/mockery.go index a0770d7a..7666ea47 100644 --- a/cmd/mockery.go +++ b/cmd/mockery.go @@ -91,15 +91,11 @@ func NewRootCmd() *cobra.Command { return cmd } -type stacker interface { - Stack() []byte -} - func printStackTrace(e error) { fmt.Printf("%v\n", e) - var s stacker - if errors.As(e, &s) { - fmt.Printf("%+s\n", s.Stack()) + + if stack, ok := stackerr.GetStack(e); ok { + fmt.Printf("%+s\n", stack) } } diff --git a/pkg/stackerr/stackerr.go b/pkg/stackerr/stackerr.go index 079762a1..e8fc415f 100644 --- a/pkg/stackerr/stackerr.go +++ b/pkg/stackerr/stackerr.go @@ -1,6 +1,7 @@ package stackerr import ( + "errors" "fmt" "runtime/debug" ) @@ -34,3 +35,13 @@ func (se StackErr) Unwrap() error { func (se StackErr) Stack() []byte { return se.stack } + +func GetStack(err error) ([]byte, bool) { + var s interface { + Stack() []byte + } + if errors.As(err, &s) { + return s.Stack(), true + } + return nil, false +} diff --git a/pkg/stackerr/stackerr_test.go b/pkg/stackerr/stackerr_test.go new file mode 100644 index 00000000..b1474b8c --- /dev/null +++ b/pkg/stackerr/stackerr_test.go @@ -0,0 +1,43 @@ +package stackerr + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestStackErr(t *testing.T) { + err := assert.AnError + + s, ok := GetStack(err) + assert.False(t, ok) + assert.Empty(t, s) + + err = NewStackErr(err) + assert.Equal(t, assert.AnError.Error(), err.Error()) + + s, ok = GetStack(err) + assert.True(t, ok) + assert.NotEmpty(t, s) + + err = NewStackErr(fmt.Errorf("wrapped error can still get stack: %w", err)) + s, ok = GetStack(err) + assert.True(t, ok) + assert.NotEmpty(t, s) +} + +func TestStackErrf(t *testing.T) { + err := assert.AnError + + s, ok := GetStack(err) + assert.False(t, ok) + assert.Empty(t, s) + + err = NewStackErrf(err, "error message %d %s", 1, "a") + assert.Equal(t, "error message 1 a: "+assert.AnError.Error(), err.Error()) + + s, ok = GetStack(err) + assert.True(t, ok) + assert.NotEmpty(t, s) +}