From eb18a1a6b819f87b37f0a886506f0943c71d1456 Mon Sep 17 00:00:00 2001 From: izumin5210 Date: Fri, 22 Nov 2019 23:28:02 +0900 Subject: [PATCH 1/2] Check error comparability for avoiding panic --- pkgerrors.go | 12 ++++++++++-- pkgerrors_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/pkgerrors.go b/pkgerrors.go index 785a12b..44a8cba 100644 --- a/pkgerrors.go +++ b/pkgerrors.go @@ -1,6 +1,7 @@ package fail import ( + "reflect" "strings" pkgerrors "github.com/pkg/errors" @@ -79,8 +80,15 @@ func extractPkgError(err error) *pkgError { break } - if len(stackTraces) == 0 && rootErr == err { - return nil + if len(stackTraces) == 0 { + ret, et := reflect.TypeOf(rootErr), reflect.TypeOf(err) + if ret != nil && et != nil && ret.Comparable() && et.Comparable() { + if rootErr == err { + return nil + } + } else if reflect.DeepEqual(rootErr, err) { + return nil + } } // Extract annotated messages by removing the trailing message. diff --git a/pkgerrors_test.go b/pkgerrors_test.go index 41d41ce..e9dda20 100644 --- a/pkgerrors_test.go +++ b/pkgerrors_test.go @@ -2,6 +2,7 @@ package fail import ( "errors" + "strings" "testing" pkgerrors "github.com/pkg/errors" @@ -20,6 +21,13 @@ func TestExtractPkgError(t *testing.T) { assert.Nil(t, pkgErr) }) + t.Run("slice error", func(t *testing.T) { + err := errorSlice{errors.New("error")} + + pkgErr := extractPkgError(err) + assert.Nil(t, pkgErr) + }) + t.Run("pkg/errors.New", func(t *testing.T) { err := pkgErrorsNew("message") @@ -84,6 +92,16 @@ func TestExtractPkgError(t *testing.T) { assert.NotEmpty(t, pkgErr.StackTrace) assert.Equal(t, "pkgErrorsWrap", pkgErr.StackTrace[0].Func) }) + + t.Run("with slice error", func(t *testing.T) { + err0 := errorSlice{errors.New("error")} + err1 := pkgErrorsWrap(err0, "message") + + pkgErr := extractPkgError(err1) + assert.NotNil(t, pkgErr) + assert.Equal(t, err0, pkgErr.Err) + assert.NotEmpty(t, pkgErr.StackTrace) + }) }) t.Run("pkg/errors.WithMessage", func(t *testing.T) { @@ -156,3 +174,13 @@ func pkgErrorsNew(msg string) error { func pkgErrorsWrap(err error, msg string) error { return pkgerrors.Wrap(err, msg) } + +type errorSlice []error + +func (s errorSlice) Error() string { + msg := make([]string, len(s)) + for i, e := range s { + msg[i] = e.Error() + } + return strings.Join(msg, ": ") +} From 4dc2444760cf27e435c692cb158ffd17ba314a84 Mon Sep 17 00:00:00 2001 From: Yuki Iwanaga Date: Tue, 14 Jan 2020 14:05:25 +0900 Subject: [PATCH 2/2] Remove redundant comparison --- pkgerrors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgerrors.go b/pkgerrors.go index 44a8cba..bd1624e 100644 --- a/pkgerrors.go +++ b/pkgerrors.go @@ -86,7 +86,7 @@ func extractPkgError(err error) *pkgError { if rootErr == err { return nil } - } else if reflect.DeepEqual(rootErr, err) { + } else { return nil } }