http2: don't rely on system TCP buffer sizes in TestServer_MaxQueuedControlFrames

This test relies on filling up a TCP write buffer, but buffer sizes aren't
under our control and can be large. Use a net.Conn wrapper that blocks instead.

Change-Id: I72471ef293f906b33f2a0fd81d69a3dd57f32fde
Reviewed-on: https://go-review.googlesource.com/c/net/+/349932
Trust: Damien Neil <dneil@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/http2/server_test.go b/http2/server_test.go
index a543b2b..258d69e 100644
--- a/http2/server_test.go
+++ b/http2/server_test.go
@@ -1185,12 +1185,34 @@
 	}
 }
 
+type filterListener struct {
+	net.Listener
+	accept func(conn net.Conn) (net.Conn, error)
+}
+
+func (l *filterListener) Accept() (net.Conn, error) {
+	c, err := l.Listener.Accept()
+	if err != nil {
+		return nil, err
+	}
+	return l.accept(c)
+}
+
 func TestServer_MaxQueuedControlFrames(t *testing.T) {
 	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
 
-	st := newServerTester(t, nil)
+	st := newServerTester(t, nil, func(ts *httptest.Server) {
+		// TCP buffer sizes on test systems aren't under our control and can be large.
+		// Create a conn that blocks after 10000 bytes written.
+		ts.Listener = &filterListener{
+			Listener: ts.Listener,
+			accept: func(conn net.Conn) (net.Conn, error) {
+				return newBlockingWriteConn(conn, 10000), nil
+			},
+		}
+	})
 	defer st.Close()
 	st.greet()