How to simulate server failure with httptest or http package in isolated unit test?
Details:
I've been using gorilla websockets, so on mt, msg, err := t.conn.ReadMessage()
mt value must be -1 when server goes down. I tried the following as the main option:
var srv *httptest.Server
srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := wsUpgrader.Upgrade(w, r, nil)
if err != nil {
t.Fatal(err)
}
srv.Close()
}))
But client didn't receive any messages at all. Also I had tried standard http server with panic, however after recover() client didn't receive any messages as well. srv.CloseClientConnections()
didn't help, client waited for messages as before.
It's sufficient to call conn.Close()
on client connection on WS server side in order to terminate connection without sending the close frame. This will trigger behavior with abnormal connection close and value of message type will be -1
.
After connection upgrade to websocket it's hijacked and general http server cannot handle this connection anymore, that's why server closing doesn't work for hijacked connections.