@@ -1600,7 +1600,62 @@ async fn poll_capacity_after_send_data_and_reserve() {
16001600 // Initial window size was 5 so current capacity is 0 even if we just reserved.
16011601 assert_eq ! ( stream. capacity( ) , 0 ) ;
16021602
1603- // The first call to `poll_capacity` in `wait_for_capacity` will return 0.
1603+ // This will panic if there is a bug causing h2 to return Ok(0) from poll_capacity.
1604+ let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 5 ) ) . await ;
1605+
1606+ stream. send_data ( "" . into ( ) , true ) . unwrap ( ) ;
1607+
1608+ // Wait for the connection to close
1609+ h2. await . unwrap ( ) ;
1610+ } ;
1611+
1612+ join ( srv, h2) . await ;
1613+ }
1614+
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.
16041659 let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 5 ) ) . await ;
16051660
16061661 stream. send_data ( "" . into ( ) , true ) . unwrap ( ) ;
0 commit comments