Hi all, I am attempting to write a test for http client timeout behaviour. Here’s my bad test server:
func startBadTestHTTPServer() *httptest.Server {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(60 * time.Second)
fmt.Fprint(w, "Hello World")
}))
return ts
}
func TestFetchBadRemoteResource(t *testing.T) {
ts := startBadTestHTTPServer()
defer ts.Close()
client := http.Client{Timeout: 15 * time.Second}
data, err := fetchRemoteResource(client, ts.URL)
if err != nil {
t.Fatal(err)
}
expected := "Hello World"
got := string(data)
if expected != got {
t.Errorf("Expected response to be: %s, Got: %s", expected, got)
}
}
When I run the test, I get:
RUN TestFetchBadRemoteResource
fetch_remote_resource_bad_server_test.go:27: Get "
http://127.0.0.1:62721": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
This is expected. But I also get:
2020/11/14 22:24:58 httptest.Server blocked in Close after 5 seconds, waiting for connections:
*net.TCPConn 0xc000124040
127.0.0.1:62722 in state active
--- FAIL: TestFetchBadRemoteResource (60.00s)
I understand why this is happening. But, my test still waits for 60 seconds for the server to shutdown.
Is there a way around this behaviour where the test server can be forcibly terminated and just carry on?
Thanks,
Amit