github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xerrors/retryable_test.go (about) 1 package xerrors 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" 10 grpcCodes "google.golang.org/grpc/codes" 11 grpcStatus "google.golang.org/grpc/status" 12 ) 13 14 func TestRetryableCode(t *testing.T) { 15 for _, tt := range []struct { 16 err error 17 code int32 18 }{ 19 { 20 err: Retryable(fmt.Errorf("some")), 21 code: -1, 22 }, 23 { 24 err: Retryable( 25 Transport(grpcStatus.Error(grpcCodes.Unavailable, "")), 26 ), 27 code: int32(grpcCodes.Unavailable), 28 }, 29 { 30 err: Retryable( 31 Operation(WithStatusCode(Ydb.StatusIds_BAD_REQUEST)), 32 ), 33 code: int32(Ydb.StatusIds_BAD_REQUEST), 34 }, 35 { 36 err: Retryable(Retryable( 37 Transport(grpcStatus.Error(grpcCodes.Unavailable, "")), 38 )), 39 code: int32(grpcCodes.Unavailable), 40 }, 41 { 42 err: Retryable(Retryable( 43 Operation(WithStatusCode(Ydb.StatusIds_BAD_REQUEST)), 44 )), 45 code: int32(Ydb.StatusIds_BAD_REQUEST), 46 }, 47 } { 48 t.Run("", func(t *testing.T) { 49 var err Error 50 require.ErrorAs(t, tt.err, &err) 51 require.Equal(t, tt.code, err.Code()) 52 }) 53 } 54 } 55 56 func TestRetriableError(t *testing.T) { 57 t.Run("retryable", func(t *testing.T) { 58 retriable := Retryable(errors.New("test")) 59 wrapped := fmt.Errorf("wrap: %w", retriable) 60 require.Equal(t, retriable, RetryableError(retriable)) 61 require.Equal(t, retriable, RetryableError(wrapped)) 62 }) 63 t.Run("unretryable", func(t *testing.T) { 64 require.NoError(t, RetryableError(errors.New("test"))) 65 require.NoError(t, RetryableError(Unretryable(Retryable(errors.New("test"))))) 66 }) 67 } 68 69 func TestUnretryableUnwrap(t *testing.T) { 70 test := errors.New("test") 71 wrapped := Unretryable(test) 72 require.ErrorIs(t, wrapped, test) 73 }