@@ -39,19 +39,19 @@ func lower(msg string) error { return errors.New(strings.ToLower(msg)) }
3939
4040// ----- tests -----
4141
42- func TestClassifyBackpressure_TypedContextDeadline (t * testing.T ) {
43- ok , reason := ClassifyBackpressure (context .DeadlineExceeded )
42+ func TestClassifyErrorReason_TypedContextDeadline (t * testing.T ) {
43+ ok , reason := ClassifyErrorReason (context .DeadlineExceeded )
4444 assert .True (t , ok )
4545 assert .Equal (t , ReasonDeadline , reason )
4646}
4747
48- func TestClassifyBackpressure_TypedNetTimeout (t * testing.T ) {
49- ok , reason := ClassifyBackpressure (netTimeoutErr {})
48+ func TestClassifyErrorReason_TypedNetTimeout (t * testing.T ) {
49+ ok , reason := ClassifyErrorReason (netTimeoutErr {})
5050 assert .True (t , ok )
5151 assert .Equal (t , ReasonNetTimeout , reason )
5252}
5353
54- func TestClassifyBackpressure_TypedGRPC_StatusCodes (t * testing.T ) {
54+ func TestClassifyErrorReason_TypedGRPC_StatusCodes (t * testing.T ) {
5555 cases := []struct {
5656 err error
5757 reason Reason
@@ -62,13 +62,13 @@ func TestClassifyBackpressure_TypedGRPC_StatusCodes(t *testing.T) {
6262 }
6363
6464 for _ , tc := range cases {
65- ok , reason := ClassifyBackpressure (tc .err )
65+ ok , reason := ClassifyErrorReason (tc .err )
6666 assert .True (t , ok , tc .err )
6767 assert .Equal (t , tc .reason , reason )
6868 }
6969}
7070
71- func TestClassifyBackpressure_TypedHTTP_StatusCodes (t * testing.T ) {
71+ func TestClassifyErrorReason_TypedHTTP_StatusCodes (t * testing.T ) {
7272 cases := []struct {
7373 code int
7474 header http.Header
@@ -83,64 +83,74 @@ func TestClassifyBackpressure_TypedHTTP_StatusCodes(t *testing.T) {
8383 for _ , tc := range cases {
8484 resp := & http.Response {StatusCode : tc .code , Header : tc .header }
8585 err := httpRespErr {resp : resp , msg : "transport error" }
86- ok , reason := ClassifyBackpressure (err )
86+ ok , reason := ClassifyErrorReason (err )
8787 assert .True (t , ok , tc )
8888 assert .Equal (t , tc .reason , reason , tc )
8989 }
9090}
9191
92- func TestClassifyBackpressure_FallbackStrings_Positive (t * testing.T ) {
93- // These exercise the lowercase + contains path.
92+ func TestClassifyErrorReason_FallbackRegex_Positive (t * testing.T ) {
93+ // These exercise the regex fallback path.
9494 cases := []struct {
9595 err error
9696 reason Reason
9797 }{
9898 {errors .New ("HTTP 429 Too Many Requests" ), ReasonHTTP429 },
9999 {lower ("too many requests" ), ReasonHTTP429 },
100+ {errors .New ("some 429 error" ), ReasonHTTP429 },
100101
101102 {errors .New ("received HTTP 503 Service Unavailable" ), ReasonHTTP503 },
102103 {lower ("service unavailable" ), ReasonHTTP503 },
104+ {errors .New ("503 blah" ), ReasonHTTP503 },
103105
104106 {errors .New ("HTTP 504 Gateway Timeout" ), ReasonHTTP504 },
105107 {lower ("gateway timeout" ), ReasonHTTP504 },
106108 {lower ("upstream timeout" ), ReasonHTTP504 },
109+ {errors .New ("got a 504" ), ReasonHTTP504 },
107110
108111 {lower ("retry-after header present" ), ReasonHTTPRetryAfter },
112+ {errors .New ("Retry-After: 30" ), ReasonHTTPRetryAfter },
113+
114+ {lower ("circuit breaker open" ), ReasonTextCircuitBreaker },
115+ {errors .New ("Circuit Breaker" ), ReasonTextCircuitBreaker },
116+
117+ {lower ("system overload" ), ReasonTextOverload },
118+ {errors .New ("OVERLOAD" ), ReasonTextOverload },
109119
110- {lower ("circuit breaker open" ), ReasonTextBackpressure },
111- {lower ("system overload" ), ReasonTextBackpressure },
112120 {lower ("backpressure detected" ), ReasonTextBackpressure },
121+ {errors .New ("BACKPRESSURE" ), ReasonTextBackpressure },
113122 }
114123
115124 for _ , tc := range cases {
116- ok , reason := ClassifyBackpressure (tc .err )
125+ ok , reason := ClassifyErrorReason (tc .err )
117126 assert .True (t , ok , tc .err )
118127 assert .Equal (t , tc .reason , reason , tc .err )
119128 }
120129}
121130
122- func TestIsBackpressure_Positive_Smoke (t * testing.T ) {
131+ func TestIsRetryableError_Positive_Smoke (t * testing.T ) {
123132 // A quick smoke test through the convenience wrapper.
124- assert .True (t , IsBackpressure (status .Error (codes .ResourceExhausted , "x" )))
125- assert .True (t , IsBackpressure (netTimeoutErr {}))
126- assert .True (t , IsBackpressure (context .DeadlineExceeded ))
127- assert .True (t , IsBackpressure (errors .New ("429" )))
128- assert .True (t , IsBackpressure (errors .New ("service unavailable" )))
129- assert .True (t , IsBackpressure (errors .New ("gateway timeout" )))
133+ assert .True (t , IsRetryableError (status .Error (codes .ResourceExhausted , "x" )))
134+ assert .True (t , IsRetryableError (netTimeoutErr {}))
135+ assert .True (t , IsRetryableError (context .DeadlineExceeded ))
136+ assert .True (t , IsRetryableError (errors .New ("429" )))
137+ assert .True (t , IsRetryableError (errors .New ("service unavailable" )))
138+ assert .True (t , IsRetryableError (errors .New ("gateway timeout" )))
139+ assert .True (t , IsRetryableError (errors .New ("OVERLOAD" )))
130140}
131141
132- func TestIsBackpressure_NegativeCases (t * testing.T ) {
142+ func TestIsRetryableError_NegativeCases (t * testing.T ) {
133143 cases := []error {
134144 nil ,
135145 errors .New ("some transient error" ),
136- errors .New ("internal server error" ), // intentionally not treated as backpressure
137- errors .New ("permission denied" ), // not backpressure
146+ errors .New ("internal server error" ), // intentionally not treated as retryable
147+ errors .New ("permission denied" ), // not retryable
138148 errors .New ("bad gateway (502)" ), // not in our fallback allowlist
139149 errors .New ("request timeout (408)" ), // not in our fallback allowlist
140150 errors .New ("proxy timeout (599)" ), // not in our fallback allowlist
141151 }
142152
143153 for _ , err := range cases {
144- assert .False (t , IsBackpressure (err ), "expected not backpressure : %v" , err )
154+ assert .False (t , IsRetryableError (err ), "expected not retryable : %v" , err )
145155 }
146156}
0 commit comments