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  }