Skip to content

Commit 357342b

Browse files
committed
deprecate StatusCode of the excpected response in favor of StatusCodes
Signed-off-by: Norwin Schnyder <[email protected]>
1 parent 749768e commit 357342b

File tree

2 files changed

+30
-26
lines changed

2 files changed

+30
-26
lines changed

conformance/utils/echo/pod.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"bytes"
2121
"context"
2222
"fmt"
23+
"slices"
24+
"strconv"
2325
"strings"
2426
"testing"
2527
"time"
@@ -84,8 +86,12 @@ func makeRequest(t *testing.T, exp *http.ExpectedResponse) []string {
8486
exp.Request.Method = "GET"
8587
}
8688

87-
if exp.Response.StatusCode == 0 {
88-
exp.Response.StatusCode = 200
89+
//nolint:staticcheck
90+
if exp.Response.StatusCode != 0 {
91+
exp.Response.StatusCodes = append(exp.Response.StatusCodes, exp.Response.StatusCode)
92+
}
93+
if len(exp.Response.StatusCodes) == 0 {
94+
exp.Response.StatusCodes = []int{200}
8995
}
9096

9197
r := exp.Request
@@ -110,8 +116,12 @@ func compareRequest(exp http.ExpectedResponse, resp Response) error {
110116
}
111117
wantReq := exp.ExpectedRequest
112118
wantResp := exp.Response
113-
if fmt.Sprint(wantResp.StatusCode) != resp.Code {
114-
return fmt.Errorf("wanted status code %v, got %v", wantResp.StatusCode, resp.Code)
119+
statusCode, err := strconv.Atoi(resp.Code)
120+
if err != nil {
121+
return fmt.Errorf("invalid status code '%v': %v", resp.Code, err)
122+
}
123+
if !slices.Contains(wantResp.StatusCodes, statusCode) {
124+
return fmt.Errorf("wanted status code to be one of %v, got %d", wantResp.StatusCodes, statusCode)
115125
}
116126
if wantReq.Headers != nil {
117127
if resp.RequestHeaders == nil {

conformance/utils/http/http.go

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"math/big"
2323
"net"
2424
"net/url"
25+
"slices"
2526
"strings"
2627
"testing"
2728
"time"
@@ -91,8 +92,9 @@ type ExpectedRequest struct {
9192

9293
// Response defines expected properties of a response from a backend.
9394
type Response struct {
95+
// Deprecated: Use StatusCodes instead, which supports matching against multiple status codes.
9496
StatusCode int
95-
StatusCodes []int // alternative to StatusCode, allows multiple acceptable codes
97+
StatusCodes []int
9698
Headers map[string]string
9799
AbsentHeaders []string
98100
Protocol string
@@ -139,8 +141,11 @@ func MakeRequest(t *testing.T, expected *ExpectedResponse, gwAddr, protocol, sch
139141
expected.Request.Method = "GET"
140142
}
141143

142-
if expected.Response.StatusCode == 0 {
143-
expected.Response.StatusCode = 200
144+
if expected.Response.StatusCode != 0 {
145+
expected.Response.StatusCodes = append(expected.Response.StatusCodes, expected.Response.StatusCode)
146+
}
147+
if len(expected.Response.StatusCodes) == 0 {
148+
expected.Response.StatusCodes = []int{200}
144149
}
145150

146151
if expected.Request.Protocol == "" {
@@ -301,23 +306,14 @@ func WaitForConsistentFailureResponse(t *testing.T, r roundtripper.RoundTripper,
301306

302307
func CompareRoundTrip(t *testing.T, req *roundtripper.Request, cReq *roundtripper.CapturedRequest, cRes *roundtripper.CapturedResponse, expected ExpectedResponse) error {
303308
if roundtripper.IsTimeoutError(cRes.StatusCode) {
304-
if roundtripper.IsTimeoutError(expected.Response.StatusCode) {
305-
return nil
306-
}
307-
}
308-
if len(expected.Response.StatusCodes) > 0 {
309-
matched := false
310-
for _, code := range expected.Response.StatusCodes {
311-
if code == cRes.StatusCode {
312-
matched = true
313-
break
309+
for _, statusCode := range expected.Response.StatusCodes {
310+
if roundtripper.IsTimeoutError(statusCode) {
311+
return nil
314312
}
315313
}
316-
if !matched {
317-
return fmt.Errorf("expected status code to be one of %v, got %d", expected.Response.StatusCodes, cRes.StatusCode)
318-
}
319-
} else if expected.Response.StatusCode != cRes.StatusCode {
320-
return fmt.Errorf("expected status code to be %d, got %d. CRes: %v", expected.Response.StatusCode, cRes.StatusCode, cRes)
314+
}
315+
if !slices.Contains(expected.Response.StatusCodes, cRes.StatusCode) {
316+
return fmt.Errorf("expected status code to be one of %v, got %d. CRes: %v", expected.Response.StatusCodes, cRes.StatusCode, cRes)
321317
}
322318
if expected.Response.Protocol != "" && expected.Response.Protocol != cRes.Protocol {
323319
return fmt.Errorf("expected protocol to be %s, got %s", expected.Response.Protocol, cRes.Protocol)
@@ -479,10 +475,8 @@ func (er *ExpectedResponse) GetTestCaseName(i int) string {
479475
if er.Backend != "" {
480476
return fmt.Sprintf("%s should go to %s", reqStr, er.Backend)
481477
}
482-
if len(er.Response.StatusCodes) > 0 {
483-
return fmt.Sprintf("%s should receive one of %v", reqStr, er.Response.StatusCodes)
484-
}
485-
return fmt.Sprintf("%s should receive a %d", reqStr, er.Response.StatusCode)
478+
479+
return fmt.Sprintf("%s should receive one of %v", reqStr, er.Response.StatusCodes)
486480
}
487481

488482
func setRedirectRequestDefaults(req *roundtripper.Request, cRes *roundtripper.CapturedResponse, expected *ExpectedResponse) {

0 commit comments

Comments
 (0)