@@ -169,24 +169,56 @@ func waitForConvergeToExpected(
169
169
tlog .Logf (t , "Request passed" )
170
170
}
171
171
172
- // CompareRequestWithWildcardStatus compares requests with wildcard status code support.
173
- // It treats a single-digit expected code (e.g., 4) as a class wildcard (4xx),
174
- // while standard 3-digit codes are matched exactly.
175
- func CompareRequestWithWildcardStatus (t * testing.T , req * roundtripper.Request , cReq * roundtripper.CapturedRequest , cRes * roundtripper.CapturedResponse , expected gwhttp.ExpectedResponse ) error {
176
- if expected .Response .StatusCode < 1 || expected .Response .StatusCode >= 100 {
177
- return gwhttp .CompareRequest (t , req , cReq , cRes , expected )
172
+ // CompareRequestWithWildcardStatus compares requests allowing single-digit
173
+ // status "classes" (e.g. 5 => any 5xx) via ExpectedResponse.Response.StatusCodes.
174
+ // If no class wildcards are present, it defers to CompareRoundTrip.
175
+ func CompareRequestWithWildcardStatus (
176
+ t * testing.T ,
177
+ req * roundtripper.Request ,
178
+ cReq * roundtripper.CapturedRequest ,
179
+ cRes * roundtripper.CapturedResponse ,
180
+ expected gwhttp.ExpectedResponse ,
181
+ ) error {
182
+ // Separate specific status codes (>=100) from wildcard classes (1..9).
183
+ var wildcardClasses []int
184
+ var specificCodes []int
185
+ seenClass := map [int ]struct {}{}
186
+ seenCode := map [int ]struct {}{}
187
+
188
+ for _ , sc := range expected .Response .StatusCodes {
189
+ switch {
190
+ case sc >= 100 :
191
+ if _ , ok := seenCode [sc ]; ! ok {
192
+ specificCodes = append (specificCodes , sc )
193
+ seenCode [sc ] = struct {}{}
194
+ }
195
+ case sc >= 1 && sc <= 9 :
196
+ if _ , ok := seenClass [sc ]; ! ok {
197
+ wildcardClasses = append (wildcardClasses , sc )
198
+ seenClass [sc ] = struct {}{}
199
+ }
200
+ }
178
201
}
179
202
180
- expectedClass := expected .Response .StatusCode
203
+ // No wildcard classes? Defer to standard comparator.
204
+ if len (wildcardClasses ) == 0 {
205
+ return gwhttp .CompareRoundTrip (t , req , cReq , cRes , expected )
206
+ }
207
+
208
+ // If the concrete status matches any wildcard class, materialize it and compare.
181
209
actualClass := cRes .StatusCode / 100
182
- if expectedClass != actualClass {
183
- return fmt .Errorf ("expected status code class %dxx, but got %d" , expectedClass , cRes .StatusCode )
210
+ for _ , wc := range wildcardClasses {
211
+ if actualClass == wc {
212
+ modified := expected
213
+ // Keep any specific codes that were provided, but ensure the actual status is allowed.
214
+ modified .Response .StatusCodes = append (append ([]int (nil ), specificCodes ... ), cRes .StatusCode )
215
+ return gwhttp .CompareRoundTrip (t , req , cReq , cRes , modified )
216
+ }
184
217
}
185
218
186
- // StatusCode Class matches; update status code on a copy to allow the standard comparator to pass.
187
- modifiedExpected := expected
188
- modifiedExpected .Response .StatusCode = cRes .StatusCode
189
- return gwhttp .CompareRequest (t , req , cReq , cRes , modifiedExpected )
219
+ // Wildcards were provided but none matched the actual class—fail clearly.
220
+ return fmt .Errorf ("expected status code class to be one of %vxx, got %d" ,
221
+ wildcardClasses , cRes .StatusCode )
190
222
}
191
223
192
224
// TODO: https://github.com/kubernetes-sigs/gateway-api-inference-extension/issues/1031
0 commit comments