github.com/grafana/pyroscope@v1.18.0/pkg/util/httpgrpcutil/errors_test.go (about)

     1  // SPDX-License-Identifier: AGPL-3.0-only
     2  
     3  package httpgrpcutil
     4  
     5  import (
     6  	"errors"
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/grafana/pyroscope/pkg/util/httpgrpc"
    13  )
    14  
    15  func TestPrioritizeRecoverableErr(t *testing.T) {
    16  	type testCase struct {
    17  		name          string
    18  		errorsIn      []error
    19  		expectedError error
    20  	}
    21  
    22  	recoverableGrpcError := httpgrpc.Errorf(http.StatusBadGateway, "recoverable error")
    23  	nonRecoverableGrpcError := httpgrpc.Errorf(http.StatusBadRequest, "non-recoverable error")
    24  	tooManyRequestsGrpcError := httpgrpc.Errorf(http.StatusTooManyRequests, "too many requests error")
    25  	nonGrpcError := errors.New("non-grpc error")
    26  
    27  	testCases := []testCase{
    28  		{
    29  			name:          "recoverable grpc error and non-recoverable grpc error",
    30  			errorsIn:      []error{recoverableGrpcError, nonRecoverableGrpcError},
    31  			expectedError: recoverableGrpcError,
    32  		}, {
    33  			name:          "recoverable grpc error and non-recoverable grpc error, reverse order",
    34  			errorsIn:      []error{nonRecoverableGrpcError, recoverableGrpcError},
    35  			expectedError: recoverableGrpcError,
    36  		}, {
    37  			name:          "non-recoverable grpc error and non-grpc error",
    38  			errorsIn:      []error{nonRecoverableGrpcError, nonGrpcError},
    39  			expectedError: nonGrpcError,
    40  		}, {
    41  			name:          "recoverable grpc error, non-recoverable grpc error and non-grpc error",
    42  			errorsIn:      []error{recoverableGrpcError, nonRecoverableGrpcError, nonGrpcError},
    43  			expectedError: recoverableGrpcError,
    44  		}, {
    45  			name:          "non-recoverable grpc error and too many requests error",
    46  			errorsIn:      []error{nonRecoverableGrpcError, tooManyRequestsGrpcError},
    47  			expectedError: tooManyRequestsGrpcError,
    48  		}, {
    49  			name:          "non-recoverable grpc error",
    50  			errorsIn:      []error{nonRecoverableGrpcError},
    51  			expectedError: nonRecoverableGrpcError,
    52  		}, {
    53  			name:          "no error",
    54  			errorsIn:      []error{},
    55  			expectedError: nil,
    56  		},
    57  	}
    58  
    59  	for _, tc := range testCases {
    60  		t.Run(tc.name, func(t *testing.T) {
    61  			gotErr := PrioritizeRecoverableErr(tc.errorsIn...)
    62  			require.Equal(t, tc.expectedError, gotErr)
    63  		})
    64  	}
    65  }