Skip to content

Commit 64ce80a

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

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

conformance/utils/echo/pod.go

Lines changed: 16 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,14 @@ 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+
// if the deprecated field StatusCode is set, append it to StatusCodes for backwards compatibility
90+
//nolint:staticcheck
91+
if exp.Response.StatusCode != 0 {
92+
exp.Response.StatusCodes = append(exp.Response.StatusCodes, exp.Response.StatusCode)
93+
}
94+
95+
if len(exp.Response.StatusCodes) == 0 {
96+
exp.Response.StatusCodes = []int{200}
8997
}
9098

9199
r := exp.Request
@@ -110,8 +118,12 @@ func compareRequest(exp http.ExpectedResponse, resp Response) error {
110118
}
111119
wantReq := exp.ExpectedRequest
112120
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)
121+
statusCode, err := strconv.Atoi(resp.Code)
122+
if err != nil {
123+
return fmt.Errorf("invalid status code '%v': %v", resp.Code, err)
124+
}
125+
if !slices.Contains(wantResp.StatusCodes, statusCode) {
126+
return fmt.Errorf("wanted status code to be one of %v, got %d", wantResp.StatusCodes, statusCode)
115127
}
116128
if wantReq.Headers != nil {
117129
if resp.RequestHeaders == nil {

conformance/utils/http/http.go

Lines changed: 18 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,13 @@ 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 the deprecated field StatusCode is set, append it to StatusCodes for backwards compatibility
145+
if expected.Response.StatusCode != 0 {
146+
expected.Response.StatusCodes = append(expected.Response.StatusCodes, expected.Response.StatusCode)
147+
}
148+
149+
if len(expected.Response.StatusCodes) == 0 {
150+
expected.Response.StatusCodes = []int{200}
144151
}
145152

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

302309
func CompareRoundTrip(t *testing.T, req *roundtripper.Request, cReq *roundtripper.CapturedRequest, cRes *roundtripper.CapturedResponse, expected ExpectedResponse) error {
303310
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
311+
for _, statusCode := range expected.Response.StatusCodes {
312+
if roundtripper.IsTimeoutError(statusCode) {
313+
return nil
314314
}
315315
}
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)
316+
}
317+
if !slices.Contains(expected.Response.StatusCodes, cRes.StatusCode) {
318+
return fmt.Errorf("expected status code to be one of %v, got %d. CRes: %v", expected.Response.StatusCodes, cRes.StatusCode, cRes)
321319
}
322320
if expected.Response.Protocol != "" && expected.Response.Protocol != cRes.Protocol {
323321
return fmt.Errorf("expected protocol to be %s, got %s", expected.Response.Protocol, cRes.Protocol)
@@ -479,10 +477,8 @@ func (er *ExpectedResponse) GetTestCaseName(i int) string {
479477
if er.Backend != "" {
480478
return fmt.Sprintf("%s should go to %s", reqStr, er.Backend)
481479
}
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)
480+
481+
return fmt.Sprintf("%s should receive one of %v", reqStr, er.Response.StatusCodes)
486482
}
487483

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

0 commit comments

Comments
 (0)