@@ -469,7 +469,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
469469
470470 // The capacity should be immediately available as nothing else is
471471 // happening on the stream.
472- assert_eq ! ( s1 . capacity ( ) , window_size) ;
472+ let mut s1 = h2 . drive ( util :: wait_for_capacity ( s1 , window_size) ) . await ;
473473
474474 let request = Request :: builder ( )
475475 . method ( Method :: POST )
@@ -492,7 +492,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
492492 s1. send_data ( "" . into ( ) , true ) . unwrap ( ) ;
493493
494494 // The capacity should be available
495- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
495+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
496496
497497 // Send the frame
498498 s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -539,9 +539,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
539539 // This effectively reserves the entire connection window
540540 s1. reserve_capacity ( window_size) ;
541541
542- // The capacity should be immediately available as nothing else is
543- // happening on the stream.
544- assert_eq ! ( s1. capacity( ) , window_size) ;
542+ let mut s1 = h2. drive ( util:: wait_for_capacity ( s1, window_size) ) . await ;
545543
546544 let request = Request :: builder ( )
547545 . method ( Method :: POST )
@@ -564,7 +562,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
564562 s1. send_trailers ( Default :: default ( ) ) . unwrap ( ) ;
565563
566564 // The capacity should be available
567- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
565+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
568566
569567 // Send the frame
570568 s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -997,10 +995,10 @@ async fn recv_no_init_window_then_receive_some_init_window() {
997995
998996 let ( response, mut stream) = client. send_request ( request, false ) . unwrap ( ) ;
999997
1000- stream. reserve_capacity ( 11 ) ;
998+ stream. reserve_capacity ( 10 ) ;
1001999
1002- let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 11 ) ) . await ;
1003- assert_eq ! ( stream. capacity( ) , 11 ) ;
1000+ let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 10 ) ) . await ;
1001+ assert_eq ! ( stream. capacity( ) , 10 ) ;
10041002
10051003 stream. send_data ( "hello world" . into ( ) , true ) . unwrap ( ) ;
10061004
@@ -2068,6 +2066,120 @@ async fn reclaim_reserved_capacity() {
20682066 join ( mock, h2) . await ;
20692067}
20702068
2069+ #[ tokio:: test]
2070+ async fn capacity_not_assigned_to_unopened_streams ( ) {
2071+ h2_support:: trace_init!( ) ;
2072+
2073+ let ( io, mut srv) = mock:: new ( ) ;
2074+
2075+ let mock = async move {
2076+ let mut settings = frame:: Settings :: default ( ) ;
2077+ settings. set_max_concurrent_streams ( Some ( 1 ) ) ;
2078+ let settings = srv. assert_client_handshake_with_settings ( settings) . await ;
2079+ assert_default_settings ! ( settings) ;
2080+
2081+ srv. recv_frame ( frames:: headers ( 1 ) . request ( "POST" , "https://www.example.com/" ) )
2082+ . await ;
2083+ srv. recv_frame ( frames:: data ( 1 , "hello" ) ) . await ;
2084+ srv. recv_frame ( frames:: data ( 1 , "world" ) . eos ( ) ) . await ;
2085+ srv. send_frame ( frames:: headers ( 1 ) . response ( 200 ) . eos ( ) ) . await ;
2086+
2087+ srv. recv_frame ( frames:: headers ( 3 ) . request ( "POST" , "https://www.example.com/" ) )
2088+ . await ;
2089+ srv. send_frame ( frames:: window_update (
2090+ 0 ,
2091+ frame:: DEFAULT_INITIAL_WINDOW_SIZE + 10 ,
2092+ ) )
2093+ . await ;
2094+ srv. recv_frame ( frames:: reset ( 3 ) . cancel ( ) ) . await ;
2095+ } ;
2096+
2097+ let h2 = async move {
2098+ let ( mut client, mut h2) = client:: handshake ( io) . await . unwrap ( ) ;
2099+ let request = Request :: builder ( )
2100+ . method ( Method :: POST )
2101+ . uri ( "https://www.example.com/" )
2102+ . body ( ( ) )
2103+ . unwrap ( ) ;
2104+
2105+ let ( response1, mut stream1) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2106+ stream1. send_data ( "hello" . into ( ) , false ) . unwrap ( ) ;
2107+ let ( _, mut stream2) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2108+ stream2. reserve_capacity ( frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ) ;
2109+ stream1. send_data ( "world" . into ( ) , true ) . unwrap ( ) ;
2110+ h2. drive ( response1) . await . unwrap ( ) ;
2111+ let stream2 = h2
2112+ . drive ( util:: wait_for_capacity (
2113+ stream2,
2114+ frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ,
2115+ ) )
2116+ . await ;
2117+ drop ( stream2) ;
2118+ h2. await . unwrap ( ) ;
2119+ } ;
2120+
2121+ join ( mock, h2) . await ;
2122+ }
2123+
2124+ #[ tokio:: test]
2125+ async fn new_initial_window_size_capacity_not_assigned_to_unopened_streams ( ) {
2126+ h2_support:: trace_init!( ) ;
2127+
2128+ let ( io, mut srv) = mock:: new ( ) ;
2129+
2130+ let mock = async move {
2131+ let mut settings = frame:: Settings :: default ( ) ;
2132+ settings. set_max_concurrent_streams ( Some ( 1 ) ) ;
2133+ settings. set_initial_window_size ( Some ( 10 ) ) ;
2134+ let settings = srv. assert_client_handshake_with_settings ( settings) . await ;
2135+ assert_default_settings ! ( settings) ;
2136+
2137+ srv. recv_frame ( frames:: headers ( 1 ) . request ( "POST" , "https://www.example.com/" ) )
2138+ . await ;
2139+ srv. recv_frame ( frames:: data ( 1 , "hello" ) ) . await ;
2140+ srv. send_frame ( frames:: settings ( ) . initial_window_size ( frame:: DEFAULT_INITIAL_WINDOW_SIZE ) )
2141+ . await ;
2142+ srv. recv_frame ( frames:: settings_ack ( ) ) . await ;
2143+ srv. send_frame ( frames:: headers ( 1 ) . response ( 200 ) . eos ( ) ) . await ;
2144+ srv. recv_frame ( frames:: data ( 1 , "world" ) . eos ( ) ) . await ;
2145+
2146+ srv. recv_frame ( frames:: headers ( 3 ) . request ( "POST" , "https://www.example.com/" ) )
2147+ . await ;
2148+ srv. send_frame ( frames:: window_update (
2149+ 0 ,
2150+ frame:: DEFAULT_INITIAL_WINDOW_SIZE + 10 ,
2151+ ) )
2152+ . await ;
2153+ srv. recv_frame ( frames:: reset ( 3 ) . cancel ( ) ) . await ;
2154+ } ;
2155+
2156+ let h2 = async move {
2157+ let ( mut client, mut h2) = client:: handshake ( io) . await . unwrap ( ) ;
2158+ let request = Request :: builder ( )
2159+ . method ( Method :: POST )
2160+ . uri ( "https://www.example.com/" )
2161+ . body ( ( ) )
2162+ . unwrap ( ) ;
2163+
2164+ let ( response1, mut stream1) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2165+ stream1. send_data ( "hello" . into ( ) , false ) . unwrap ( ) ;
2166+ let ( _, mut stream2) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2167+ stream2. reserve_capacity ( frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ) ;
2168+ h2. drive ( response1) . await . unwrap ( ) ;
2169+ stream1. send_data ( "world" . into ( ) , true ) . unwrap ( ) ;
2170+ let stream2 = h2
2171+ . drive ( util:: wait_for_capacity (
2172+ stream2,
2173+ frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ,
2174+ ) )
2175+ . await ;
2176+ drop ( stream2) ;
2177+ h2. await . unwrap ( ) ;
2178+ } ;
2179+
2180+ join ( mock, h2) . await ;
2181+ }
2182+
20712183// ==== abusive window updates ====
20722184
20732185#[ tokio:: test]
0 commit comments