Ensure timeout test handlers don't complete before timing out.

TestTimeoutRequestHeaders and TestTimeoutWithLogging are designed to
catch data races on request headers and include an HTTP handler that
triggers timeout then repeatedly mutates request headers. Sometimes,
the request header mutation loop could complete before the timeout
filter observed the timeout, resulting in a test failure. The mutation
loop now runs until the test ends.

Kubernetes-commit: e5a15c87e9d83ee19ba93aa356dfbb7b33a013c8
This commit is contained in:
Ben Luddy 2023-06-07 12:48:33 -04:00 committed by Kubernetes Publisher
parent 0d8046157b
commit 302a5c27a6
1 changed files with 22 additions and 8 deletions

View File

@ -272,6 +272,8 @@ func TestTimeoutRequestHeaders(t *testing.T) {
})
}
testDone := make(chan struct{})
defer close(testDone)
ts := httptest.NewServer(
withDeadline(
WithTimeoutForNonLongRunningRequests(
@ -280,8 +282,13 @@ func TestTimeoutRequestHeaders(t *testing.T) {
cancel()
// mutate request Headers
// Authorization filter does it for example
for j := 0; j < 10000; j++ {
req.Header.Set("Test", "post")
for {
select {
case <-testDone:
return
default:
req.Header.Set("Test", "post")
}
}
}),
func(r *http.Request, requestInfo *request.RequestInfo) bool {
@ -301,8 +308,8 @@ func TestTimeoutRequestHeaders(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if res.StatusCode != http.StatusGatewayTimeout {
t.Errorf("got res.StatusCde %d; expected %d", res.StatusCode, http.StatusServiceUnavailable)
if actual, expected := res.StatusCode, http.StatusGatewayTimeout; actual != expected {
t.Errorf("got status code %d; expected %d", actual, expected)
}
res.Body.Close()
}
@ -323,6 +330,8 @@ func TestTimeoutWithLogging(t *testing.T) {
})
}
testDone := make(chan struct{})
defer close(testDone)
ts := httptest.NewServer(
WithHTTPLogging(
withDeadline(
@ -332,8 +341,13 @@ func TestTimeoutWithLogging(t *testing.T) {
cancel()
// mutate request Headers
// Authorization filter does it for example
for j := 0; j < 10000; j++ {
req.Header.Set("Test", "post")
for {
select {
case <-testDone:
return
default:
req.Header.Set("Test", "post")
}
}
}),
func(r *http.Request, requestInfo *request.RequestInfo) bool {
@ -354,8 +368,8 @@ func TestTimeoutWithLogging(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if res.StatusCode != http.StatusGatewayTimeout {
t.Errorf("got res.StatusCode %d; expected %d", res.StatusCode, http.StatusServiceUnavailable)
if actual, expected := res.StatusCode, http.StatusGatewayTimeout; actual != expected {
t.Errorf("got status code %d; expected %d", actual, expected)
}
res.Body.Close()
}