github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/conn/errors_test.go (about)

     1  package conn
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	grpcCodes "google.golang.org/grpc/codes"
     9  	grpcStatus "google.golang.org/grpc/status"
    10  
    11  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
    12  )
    13  
    14  func TestIsBadConn(t *testing.T) {
    15  	for i, tt := range []struct {
    16  		err           error
    17  		goodConnCodes []grpcCodes.Code
    18  		badConn       bool
    19  	}{
    20  		{
    21  			err:     fmt.Errorf("test"),
    22  			badConn: false,
    23  		},
    24  		{
    25  			err:     xerrors.Operation(),
    26  			badConn: false,
    27  		},
    28  		{
    29  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.ResourceExhausted, "")),
    30  			badConn: false,
    31  		},
    32  		{
    33  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Unavailable, "")),
    34  			badConn: true,
    35  		},
    36  		{
    37  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.OK, "")),
    38  			badConn: false,
    39  		},
    40  		{
    41  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Canceled, "")),
    42  			badConn: true,
    43  		},
    44  		{
    45  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Unknown, "")),
    46  			badConn: true,
    47  		},
    48  		{
    49  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.InvalidArgument, "")),
    50  			badConn: true,
    51  		},
    52  		{
    53  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.DeadlineExceeded, "")),
    54  			badConn: true,
    55  		},
    56  		{
    57  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.NotFound, "")),
    58  			badConn: true,
    59  		},
    60  		{
    61  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.AlreadyExists, "")),
    62  			badConn: true,
    63  		},
    64  		{
    65  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.PermissionDenied, "")),
    66  			badConn: true,
    67  		},
    68  		{
    69  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.FailedPrecondition, "")),
    70  			badConn: true,
    71  		},
    72  		{
    73  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Aborted, "")),
    74  			badConn: true,
    75  		},
    76  		{
    77  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.OutOfRange, "")),
    78  			badConn: false,
    79  		},
    80  		{
    81  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Unimplemented, "")),
    82  			badConn: true,
    83  		},
    84  		{
    85  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Internal, "")),
    86  			badConn: true,
    87  		},
    88  		{
    89  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.DataLoss, "")),
    90  			badConn: true,
    91  		},
    92  		{
    93  			err:     xerrors.Transport(grpcStatus.Error(grpcCodes.Unauthenticated, "")),
    94  			badConn: true,
    95  		},
    96  		{
    97  			err: xerrors.Transport(grpcStatus.Error(grpcCodes.Unauthenticated, "")),
    98  			goodConnCodes: []grpcCodes.Code{
    99  				grpcCodes.Unauthenticated,
   100  			},
   101  			badConn: false,
   102  		},
   103  	} {
   104  		t.Run(fmt.Sprintf("%d. %v", i, tt.err), func(t *testing.T) {
   105  			require.Equal(t, tt.badConn, IsBadConn(tt.err, tt.goodConnCodes...))
   106  			require.Equal(t, tt.badConn, IsBadConn(xerrors.WithStackTrace(tt.err), tt.goodConnCodes...))
   107  			require.Equal(t, tt.badConn, IsBadConn(xerrors.Retryable(tt.err), tt.goodConnCodes...))
   108  		})
   109  	}
   110  }