Skip to content

Commit

Permalink
Merge PR cosmos#5484: Add errors.Is support to the wrappedError
Browse files Browse the repository at this point in the history
  • Loading branch information
PumpkinSeed authored and alexanderbez committed Jan 8, 2020
1 parent e80fc46 commit 67c2acd
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
28 changes: 28 additions & 0 deletions types/errors/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,34 @@ func (e *wrappedError) Cause() error {
return e.parent
}

// Is reports whether any error in e's chain matches a target.
func (e *wrappedError) Is(target error) bool {
if target == nil {
return e == target
}

w := e.Cause()

for {
if w == target {
return true
}

x, ok := w.(causer)
if ok {
w = x.Cause()
}
if x == nil {
return false
}
}
}

// Unwrap implements the built-in errors.Unwrap
func (e *wrappedError) Unwrap() error {
return e.parent
}

// Recover captures a panic and stop its propagation. If panic happens it is
// transformed into a ErrPanic instance and assigned to given error. Call this
// function using defer in order to work as expected.
Expand Down
50 changes: 50 additions & 0 deletions types/errors/errors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"testing"

"github.com/stretchr/testify/require"

"github.com/pkg/errors"
)

Expand Down Expand Up @@ -158,3 +160,51 @@ func TestWrapEmpty(t *testing.T) {
t.Fatal(err)
}
}

func TestWrappedIs(t *testing.T) {
err := Wrap(ErrTxTooLarge, "context")
require.True(t, stdlib.Is(err, ErrTxTooLarge))

err = Wrap(err, "more context")
require.True(t, stdlib.Is(err, ErrTxTooLarge))

err = Wrap(err, "even more context")
require.True(t, stdlib.Is(err, ErrTxTooLarge))

err = Wrap(ErrInsufficientFee, "...")
require.False(t, stdlib.Is(err, ErrTxTooLarge))
}

func TestWrappedIsMultiple(t *testing.T) {
var errTest = errors.New("test error")
var errTest2 = errors.New("test error 2")
err := Wrap(errTest2, Wrap(errTest, "some random description").Error())
require.True(t, stdlib.Is(err, errTest2))
}

func TestWrappedIsFail(t *testing.T) {
var errTest = errors.New("test error")
var errTest2 = errors.New("test error 2")
err := Wrap(errTest2, Wrap(errTest, "some random description").Error())
require.False(t, stdlib.Is(err, errTest))
}

func TestWrappedUnwrap(t *testing.T) {
var errTest = errors.New("test error")
err := Wrap(errTest, "some random description")
require.Equal(t, errTest, stdlib.Unwrap(err))
}

func TestWrappedUnwrapMultiple(t *testing.T) {
var errTest = errors.New("test error")
var errTest2 = errors.New("test error 2")
err := Wrap(errTest2, Wrap(errTest, "some random description").Error())
require.Equal(t, errTest2, stdlib.Unwrap(err))
}

func TestWrappedUnwrapFail(t *testing.T) {
var errTest = errors.New("test error")
var errTest2 = errors.New("test error 2")
err := Wrap(errTest2, Wrap(errTest, "some random description").Error())
require.NotEqual(t, errTest, stdlib.Unwrap(err))
}

0 comments on commit 67c2acd

Please sign in to comment.