http2: deflake TestTransportMaxFrameReadSize

Rewrite this test to examine the SETTINGS frame sent by the Transport
directly, rather than poking around in the Server internals to find
the sent value.

Fixes golang/go#56806

Change-Id: I47859352a14b7120ef88fce5bd000716b9abdad7
Reviewed-on: https://go-review.googlesource.com/c/net/+/451775
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Damien Neil <dneil@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
diff --git a/http2/transport_test.go b/http2/transport_test.go
index 42d7dbc..00776ad 100644
--- a/http2/transport_test.go
+++ b/http2/transport_test.go
@@ -741,12 +741,13 @@
 }
 
 type clientTester struct {
-	t      *testing.T
-	tr     *Transport
-	sc, cc net.Conn // server and client conn
-	fr     *Framer  // server's framer
-	client func() error
-	server func() error
+	t        *testing.T
+	tr       *Transport
+	sc, cc   net.Conn // server and client conn
+	fr       *Framer  // server's framer
+	settings *SettingsFrame
+	client   func() error
+	server   func() error
 }
 
 func newClientTester(t *testing.T) *clientTester {
@@ -809,9 +810,9 @@
 	if err != nil {
 		ct.t.Fatalf("Reading client settings frame: %v", err)
 	}
-	if sf, ok := f.(*SettingsFrame); !ok {
+	var ok bool
+	if ct.settings, ok = f.(*SettingsFrame); !ok {
 		ct.t.Fatalf("Wanted client settings frame; got %v", f)
-		_ = sf // stash it away?
 	}
 	if err := ct.fr.WriteSettings(settings...); err != nil {
 		ct.t.Fatal(err)
@@ -3998,62 +3999,42 @@
 	ct.run()
 }
 
-// Test that the server received values are in range.
 func TestTransportMaxFrameReadSize(t *testing.T) {
-	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
-	}, func(s *Server) {
-		s.MaxConcurrentStreams = 1
-	})
-	defer st.Close()
-	tr := &Transport{
-		TLSClientConfig:  tlsConfigInsecure,
-		MaxReadFrameSize: 64000,
+	for _, test := range []struct {
+		maxReadFrameSize uint32
+		want             uint32
+	}{{
+		maxReadFrameSize: 64000,
+		want:             64000,
+	}, {
+		maxReadFrameSize: 1024,
+		want:             minMaxFrameSize,
+	}} {
+		ct := newClientTester(t)
+		ct.tr.MaxReadFrameSize = test.maxReadFrameSize
+		ct.client = func() error {
+			req, _ := http.NewRequest("GET", "https://dummy.tld/", http.NoBody)
+			ct.tr.RoundTrip(req)
+			return nil
+		}
+		ct.server = func() error {
+			defer ct.cc.(*net.TCPConn).Close()
+			ct.greet()
+			var got uint32
+			ct.settings.ForeachSetting(func(s Setting) error {
+				switch s.ID {
+				case SettingMaxFrameSize:
+					got = s.Val
+				}
+				return nil
+			})
+			if got != test.want {
+				t.Errorf("Transport.MaxReadFrameSize = %v; server got %v, want %v", test.maxReadFrameSize, got, test.want)
+			}
+			return nil
+		}
+		ct.run()
 	}
-	defer tr.CloseIdleConnections()
-
-	req, err := http.NewRequest("GET", st.ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res, err := tr.RoundTrip(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got, want := res.StatusCode, 200; got != want {
-		t.Errorf("StatusCode = %v; want %v", got, want)
-	}
-	if res != nil && res.Body != nil {
-		res.Body.Close()
-	}
-	// Test that maxFrameReadSize() matches the requested size.
-	if got, want := tr.maxFrameReadSize(), uint32(64000); got != want {
-		t.Errorf("maxFrameReadSize = %v; want %v", got, want)
-	}
-	// Test that server receives the requested size.
-	if got, want := st.sc.maxFrameSize, int32(64000); got != want {
-		t.Errorf("maxFrameReadSize = %v; want %v", got, want)
-	}
-
-	// test for minimum frame read size
-	tr = &Transport{
-		TLSClientConfig:  tlsConfigInsecure,
-		MaxReadFrameSize: 1024,
-	}
-
-	if got, want := tr.maxFrameReadSize(), uint32(minMaxFrameSize); got != want {
-		t.Errorf("maxFrameReadSize = %v; want %v", got, want)
-	}
-
-	// test for maximum frame size
-	tr = &Transport{
-		TLSClientConfig:  tlsConfigInsecure,
-		MaxReadFrameSize: 1024 * 1024 * 16,
-	}
-
-	if got, want := tr.maxFrameReadSize(), uint32(maxFrameSize); got != want {
-		t.Errorf("maxFrameReadSize = %v; want %v", got, want)
-	}
-
 }
 
 func TestTransportRequestsLowServerLimit(t *testing.T) {