Skip to content

Commit b0013c6

Browse files
neildgopherbot
authored andcommitted
http2: modernize TestTransportChecksRequestHeaderListSize
Rewrite this test to use testClientConn, which simplifies tests of client-only functionality. Change-Id: I9ff86ef1267323caf6e085fe140f6d4641740328 Reviewed-on: https://go-review.googlesource.com/c/net/+/700921 Reviewed-by: Nicholas Husin <[email protected]> Reviewed-by: Nicholas Husin <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Auto-Submit: Nicholas Husin <[email protected]>
1 parent 162ad30 commit b0013c6

File tree

1 file changed

+26
-93
lines changed

1 file changed

+26
-93
lines changed

http2/transport_test.go

Lines changed: 26 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,7 @@ func headerListSize(h http.Header) (size uint32) {
13591359
// space for an empty "Pad-Headers" key, then adds as many copies of
13601360
// filler as possible. Any remaining bytes necessary to push the
13611361
// header list size up to limit are added to h["Pad-Headers"].
1362-
func padHeaders(t *testing.T, h http.Header, limit uint64, filler string) {
1362+
func padHeaders(t testing.TB, h http.Header, limit uint64, filler string) {
13631363
if limit > 0xffffffff {
13641364
t.Fatalf("padHeaders: refusing to pad to more than 2^32-1 bytes. limit = %v", limit)
13651365
}
@@ -1452,61 +1452,35 @@ func TestPadHeaders(t *testing.T) {
14521452
}
14531453

14541454
func TestTransportChecksRequestHeaderListSize(t *testing.T) {
1455-
ts := newTestServer(t,
1456-
func(w http.ResponseWriter, r *http.Request) {
1457-
// Consume body & force client to send
1458-
// trailers before writing response.
1459-
// io.ReadAll returns non-nil err for
1460-
// requests that attempt to send greater than
1461-
// maxHeaderListSize bytes of trailers, since
1462-
// those requests generate a stream reset.
1463-
io.ReadAll(r.Body)
1464-
r.Body.Close()
1465-
},
1466-
func(ts *httptest.Server) {
1467-
ts.Config.MaxHeaderBytes = 16 << 10
1468-
},
1469-
optQuiet,
1470-
)
1455+
synctestTest(t, testTransportChecksRequestHeaderListSize)
1456+
}
1457+
func testTransportChecksRequestHeaderListSize(t testing.TB) {
1458+
const peerSize = 16 << 10
14711459

1472-
tr := &Transport{TLSClientConfig: tlsConfigInsecure}
1473-
defer tr.CloseIdleConnections()
1460+
tc := newTestClientConn(t)
1461+
tc.greet(Setting{SettingMaxHeaderListSize, peerSize})
14741462

14751463
checkRoundTrip := func(req *http.Request, wantErr error, desc string) {
1476-
// Make an arbitrary request to ensure we get the server's
1477-
// settings frame and initialize peerMaxHeaderListSize.
1478-
req0, err := http.NewRequest("GET", ts.URL, nil)
1479-
if err != nil {
1480-
t.Fatalf("newRequest: NewRequest: %v", err)
1481-
}
1482-
res0, err := tr.RoundTrip(req0)
1483-
if err != nil {
1484-
t.Errorf("%v: Initial RoundTrip err = %v", desc, err)
1485-
}
1486-
res0.Body.Close()
1487-
1488-
res, err := tr.RoundTrip(req)
1489-
if !errors.Is(err, wantErr) {
1490-
if res != nil {
1491-
res.Body.Close()
1492-
}
1493-
t.Errorf("%v: RoundTrip err = %v; want %v", desc, err, wantErr)
1494-
return
1495-
}
1496-
if err == nil {
1497-
if res == nil {
1498-
t.Errorf("%v: response nil; want non-nil.", desc)
1499-
return
1500-
}
1501-
defer res.Body.Close()
1502-
if res.StatusCode != http.StatusOK {
1503-
t.Errorf("%v: response status = %v; want %v", desc, res.StatusCode, http.StatusOK)
1464+
t.Helper()
1465+
rt := tc.roundTrip(req)
1466+
if wantErr != nil {
1467+
if err := rt.err(); !errors.Is(err, wantErr) {
1468+
t.Errorf("%v: RoundTrip err = %v; want %v", desc, err, wantErr)
15041469
}
15051470
return
15061471
}
1507-
if res != nil {
1508-
t.Errorf("%v: RoundTrip err = %v but response non-nil", desc, err)
1509-
}
1472+
1473+
tc.wantFrameType(FrameHeaders)
1474+
tc.writeHeaders(HeadersFrameParam{
1475+
StreamID: rt.streamID(),
1476+
EndHeaders: true,
1477+
EndStream: true,
1478+
BlockFragment: tc.makeHeaderBlockFragment(
1479+
":status", "200",
1480+
),
1481+
})
1482+
1483+
rt.wantStatus(http.StatusOK)
15101484
}
15111485
headerListSizeForRequest := func(req *http.Request) (size uint64) {
15121486
const addGzipHeader = true
@@ -1526,56 +1500,15 @@ func TestTransportChecksRequestHeaderListSize(t *testing.T) {
15261500
newRequest := func() *http.Request {
15271501
// Body must be non-nil to enable writing trailers.
15281502
body := strings.NewReader("hello")
1529-
req, err := http.NewRequest("POST", ts.URL, body)
1503+
req, err := http.NewRequest("POST", "https://example.tld/", body)
15301504
if err != nil {
15311505
t.Fatalf("newRequest: NewRequest: %v", err)
15321506
}
15331507
return req
15341508
}
15351509

1536-
var (
1537-
scMu sync.Mutex
1538-
sc *serverConn
1539-
)
1540-
testHookGetServerConn = func(v *serverConn) {
1541-
scMu.Lock()
1542-
defer scMu.Unlock()
1543-
if sc != nil {
1544-
panic("testHookGetServerConn called multiple times")
1545-
}
1546-
sc = v
1547-
}
1548-
defer func() {
1549-
testHookGetServerConn = nil
1550-
}()
1551-
1552-
// Validate peerMaxHeaderListSize.
1553-
req := newRequest()
1554-
checkRoundTrip(req, nil, "Initial request")
1555-
addr := authorityAddr(req.URL.Scheme, req.URL.Host)
1556-
cc, err := tr.connPool().GetClientConn(req, addr)
1557-
if err != nil {
1558-
t.Fatalf("GetClientConn: %v", err)
1559-
}
1560-
cc.mu.Lock()
1561-
peerSize := cc.peerMaxHeaderListSize
1562-
cc.mu.Unlock()
1563-
scMu.Lock()
1564-
wantSize := uint64(sc.maxHeaderListSize())
1565-
scMu.Unlock()
1566-
if peerSize != wantSize {
1567-
t.Errorf("peerMaxHeaderListSize = %v; want %v", peerSize, wantSize)
1568-
}
1569-
1570-
// Sanity check peerSize. (*serverConn) maxHeaderListSize adds
1571-
// 320 bytes of padding.
1572-
wantHeaderBytes := uint64(ts.Config.MaxHeaderBytes) + 320
1573-
if peerSize != wantHeaderBytes {
1574-
t.Errorf("peerMaxHeaderListSize = %v; want %v.", peerSize, wantHeaderBytes)
1575-
}
1576-
15771510
// Pad headers & trailers, but stay under peerSize.
1578-
req = newRequest()
1511+
req := newRequest()
15791512
req.Header = make(http.Header)
15801513
req.Trailer = make(http.Header)
15811514
filler := strings.Repeat("*", 1024)

0 commit comments

Comments
 (0)