github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/lib/errors/errors_test.go (about) 1 package errors_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 9 "github.com/rclone/rclone/lib/errors" 10 ) 11 12 func TestWalk(t *testing.T) { 13 origin := errors.New("origin") 14 15 for _, test := range []struct { 16 err error 17 calls int 18 last error 19 }{ 20 {causerError{nil}, 1, causerError{nil}}, 21 {wrapperError{nil}, 1, wrapperError{nil}}, 22 {reflectError{nil}, 1, reflectError{nil}}, 23 {causerError{origin}, 2, origin}, 24 {wrapperError{origin}, 2, origin}, 25 {reflectError{origin}, 2, origin}, 26 {causerError{reflectError{origin}}, 3, origin}, 27 {wrapperError{causerError{origin}}, 3, origin}, 28 {reflectError{wrapperError{origin}}, 3, origin}, 29 {causerError{reflectError{causerError{origin}}}, 4, origin}, 30 {wrapperError{causerError{wrapperError{origin}}}, 4, origin}, 31 {reflectError{wrapperError{reflectError{origin}}}, 4, origin}, 32 33 {stopError{nil}, 1, stopError{nil}}, 34 {stopError{causerError{nil}}, 1, stopError{causerError{nil}}}, 35 {stopError{wrapperError{nil}}, 1, stopError{wrapperError{nil}}}, 36 {stopError{reflectError{nil}}, 1, stopError{reflectError{nil}}}, 37 {causerError{stopError{origin}}, 2, stopError{origin}}, 38 {wrapperError{stopError{origin}}, 2, stopError{origin}}, 39 {reflectError{stopError{origin}}, 2, stopError{origin}}, 40 {causerError{reflectError{stopError{nil}}}, 3, stopError{nil}}, 41 {wrapperError{causerError{stopError{nil}}}, 3, stopError{nil}}, 42 {reflectError{wrapperError{stopError{nil}}}, 3, stopError{nil}}, 43 } { 44 var last error 45 calls := 0 46 errors.Walk(test.err, func(err error) bool { 47 calls++ 48 last = err 49 _, stop := err.(stopError) 50 return stop 51 }) 52 assert.Equal(t, test.calls, calls) 53 assert.Equal(t, test.last, last) 54 } 55 } 56 57 type causerError struct { 58 err error 59 } 60 type wrapperError struct { 61 err error 62 } 63 type reflectError struct { 64 Err error 65 } 66 type stopError struct { 67 err error 68 } 69 70 func (e causerError) Error() string { 71 return fmt.Sprintf("causerError(%s)", e.err) 72 } 73 func (e causerError) Cause() error { 74 return e.err 75 } 76 func (e wrapperError) Unwrap() error { 77 return e.err 78 } 79 func (e wrapperError) Error() string { 80 return fmt.Sprintf("wrapperError(%s)", e.err) 81 } 82 func (e reflectError) Error() string { 83 return fmt.Sprintf("reflectError(%s)", e.Err) 84 } 85 func (e stopError) Error() string { 86 return fmt.Sprintf("stopError(%s)", e.err) 87 } 88 func (e stopError) Cause() error { 89 return e.err 90 }