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  }