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 }