@@ -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]
16161671async fn max_send_buffer_size_overflow ( ) {
16171672 h2_support:: trace_init!( ) ;
0 commit comments