Skip to content

Commit 84148fc

Browse files
committed
Add a test that fails because capacity returns 0
1 parent bd35617 commit 84148fc

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

tests/h2-tests/tests/flow_control.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,61 @@ async fn poll_capacity_after_send_data_and_reserve() {
16121612
join(srv, h2).await;
16131613
}
16141614

1615+
#[tokio::test]
1616+
async fn poll_capacity_after_send_data_and_reserve_with_max_send_buffer_size() {
1617+
h2_support::trace_init!();
1618+
let (io, mut srv) = mock::new();
1619+
1620+
let srv = async move {
1621+
let settings = srv
1622+
.assert_client_handshake_with_settings(frames::settings().initial_window_size(10))
1623+
.await;
1624+
assert_default_settings!(settings);
1625+
srv.recv_frame(frames::headers(1).request("POST", "https://www.example.com/"))
1626+
.await;
1627+
srv.send_frame(frames::headers(1).response(200)).await;
1628+
srv.recv_frame(frames::data(1, &b"abcde"[..])).await;
1629+
srv.send_frame(frames::window_update(1, 10)).await;
1630+
srv.recv_frame(frames::data(1, &b""[..]).eos()).await;
1631+
};
1632+
1633+
let h2 = async move {
1634+
let (mut client, mut h2) = client::Builder::new()
1635+
.max_send_buffer_size(5)
1636+
.handshake::<_, Bytes>(io)
1637+
.await
1638+
.unwrap();
1639+
let request = Request::builder()
1640+
.method(Method::POST)
1641+
.uri("https://www.example.com/")
1642+
.body(())
1643+
.unwrap();
1644+
1645+
let (response, mut stream) = client.send_request(request, false).unwrap();
1646+
1647+
let response = h2.drive(response).await.unwrap();
1648+
assert_eq!(response.status(), StatusCode::OK);
1649+
1650+
stream.send_data("abcde".into(), false).unwrap();
1651+
1652+
stream.reserve_capacity(5);
1653+
1654+
// Initial window size was 10 but with a max send buffer size of 10 in the client,
1655+
// so current capacity is 0 even if we just reserved.
1656+
assert_eq!(stream.capacity(), 0);
1657+
1658+
// This will panic if there is a bug causing h2 to return Ok(0) from poll_capacity.
1659+
let mut stream = h2.drive(util::wait_for_capacity(stream, 5)).await;
1660+
1661+
stream.send_data("".into(), true).unwrap();
1662+
1663+
// Wait for the connection to close
1664+
h2.await.unwrap();
1665+
};
1666+
1667+
join(srv, h2).await;
1668+
}
1669+
16151670
#[tokio::test]
16161671
async fn max_send_buffer_size_overflow() {
16171672
h2_support::trace_init!();

0 commit comments

Comments
 (0)