Merge PR #5484: Add errors.Is support to the wrappedError
This commit is contained in:
parent
e80fc463f7
commit
67c2acd75a
|
@ -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.
|
||||
|
|
|
@ -5,6 +5,8 @@ import (
|
|||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
|
@ -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))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue