@@ -391,7 +391,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
391391
392392 // The capacity should be immediately available as nothing else is
393393 // happening on the stream.
394- assert_eq ! ( s1 . capacity ( ) , window_size) ;
394+ let mut s1 = h2 . drive ( util :: wait_for_capacity ( s1 , window_size) ) . await ;
395395
396396 let request = Request :: builder ( )
397397 . method ( Method :: POST )
@@ -414,7 +414,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
414414 s1. send_data ( "" . into ( ) , true ) . unwrap ( ) ;
415415
416416 // The capacity should be available
417- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
417+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
418418
419419 // Send the frame
420420 s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -461,9 +461,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
461461 // This effectively reserves the entire connection window
462462 s1. reserve_capacity ( window_size) ;
463463
464- // The capacity should be immediately available as nothing else is
465- // happening on the stream.
466- assert_eq ! ( s1. capacity( ) , window_size) ;
464+ let mut s1 = h2. drive ( util:: wait_for_capacity ( s1, window_size) ) . await ;
467465
468466 let request = Request :: builder ( )
469467 . method ( Method :: POST )
@@ -486,7 +484,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
486484 s1. send_trailers ( Default :: default ( ) ) . unwrap ( ) ;
487485
488486 // The capacity should be available
489- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
487+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
490488
491489 // Send the frame
492490 s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -919,10 +917,10 @@ async fn recv_no_init_window_then_receive_some_init_window() {
919917
920918 let ( response, mut stream) = client. send_request ( request, false ) . unwrap ( ) ;
921919
922- stream. reserve_capacity ( 11 ) ;
920+ stream. reserve_capacity ( 10 ) ;
923921
924- let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 11 ) ) . await ;
925- assert_eq ! ( stream. capacity( ) , 11 ) ;
922+ let mut stream = h2. drive ( util:: wait_for_capacity ( stream, 10 ) ) . await ;
923+ assert_eq ! ( stream. capacity( ) , 10 ) ;
926924
927925 stream. send_data ( "hello world" . into ( ) , true ) . unwrap ( ) ;
928926
@@ -1990,6 +1988,120 @@ async fn reclaim_reserved_capacity() {
19901988 join ( mock, h2) . await ;
19911989}
19921990
1991+ #[ tokio:: test]
1992+ async fn capacity_not_assigned_to_unopened_streams ( ) {
1993+ h2_support:: trace_init!( ) ;
1994+
1995+ let ( io, mut srv) = mock:: new ( ) ;
1996+
1997+ let mock = async move {
1998+ let mut settings = frame:: Settings :: default ( ) ;
1999+ settings. set_max_concurrent_streams ( Some ( 1 ) ) ;
2000+ let settings = srv. assert_client_handshake_with_settings ( settings) . await ;
2001+ assert_default_settings ! ( settings) ;
2002+
2003+ srv. recv_frame ( frames:: headers ( 1 ) . request ( "POST" , "https://www.example.com/" ) )
2004+ . await ;
2005+ srv. recv_frame ( frames:: data ( 1 , "hello" ) ) . await ;
2006+ srv. recv_frame ( frames:: data ( 1 , "world" ) . eos ( ) ) . await ;
2007+ srv. send_frame ( frames:: headers ( 1 ) . response ( 200 ) . eos ( ) ) . await ;
2008+
2009+ srv. recv_frame ( frames:: headers ( 3 ) . request ( "POST" , "https://www.example.com/" ) )
2010+ . await ;
2011+ srv. send_frame ( frames:: window_update (
2012+ 0 ,
2013+ frame:: DEFAULT_INITIAL_WINDOW_SIZE + 10 ,
2014+ ) )
2015+ . await ;
2016+ srv. recv_frame ( frames:: reset ( 3 ) . cancel ( ) ) . await ;
2017+ } ;
2018+
2019+ let h2 = async move {
2020+ let ( mut client, mut h2) = client:: handshake ( io) . await . unwrap ( ) ;
2021+ let request = Request :: builder ( )
2022+ . method ( Method :: POST )
2023+ . uri ( "https://www.example.com/" )
2024+ . body ( ( ) )
2025+ . unwrap ( ) ;
2026+
2027+ let ( response1, mut stream1) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2028+ stream1. send_data ( "hello" . into ( ) , false ) . unwrap ( ) ;
2029+ let ( _, mut stream2) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2030+ stream2. reserve_capacity ( frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ) ;
2031+ stream1. send_data ( "world" . into ( ) , true ) . unwrap ( ) ;
2032+ h2. drive ( response1) . await . unwrap ( ) ;
2033+ let stream2 = h2
2034+ . drive ( util:: wait_for_capacity (
2035+ stream2,
2036+ frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ,
2037+ ) )
2038+ . await ;
2039+ drop ( stream2) ;
2040+ h2. await . unwrap ( ) ;
2041+ } ;
2042+
2043+ join ( mock, h2) . await ;
2044+ }
2045+
2046+ #[ tokio:: test]
2047+ async fn new_initial_window_size_capacity_not_assigned_to_unopened_streams ( ) {
2048+ h2_support:: trace_init!( ) ;
2049+
2050+ let ( io, mut srv) = mock:: new ( ) ;
2051+
2052+ let mock = async move {
2053+ let mut settings = frame:: Settings :: default ( ) ;
2054+ settings. set_max_concurrent_streams ( Some ( 1 ) ) ;
2055+ settings. set_initial_window_size ( Some ( 10 ) ) ;
2056+ let settings = srv. assert_client_handshake_with_settings ( settings) . await ;
2057+ assert_default_settings ! ( settings) ;
2058+
2059+ srv. recv_frame ( frames:: headers ( 1 ) . request ( "POST" , "https://www.example.com/" ) )
2060+ . await ;
2061+ srv. recv_frame ( frames:: data ( 1 , "hello" ) ) . await ;
2062+ srv. send_frame ( frames:: settings ( ) . initial_window_size ( frame:: DEFAULT_INITIAL_WINDOW_SIZE ) )
2063+ . await ;
2064+ srv. recv_frame ( frames:: settings_ack ( ) ) . await ;
2065+ srv. send_frame ( frames:: headers ( 1 ) . response ( 200 ) . eos ( ) ) . await ;
2066+ srv. recv_frame ( frames:: data ( 1 , "world" ) . eos ( ) ) . await ;
2067+
2068+ srv. recv_frame ( frames:: headers ( 3 ) . request ( "POST" , "https://www.example.com/" ) )
2069+ . await ;
2070+ srv. send_frame ( frames:: window_update (
2071+ 0 ,
2072+ frame:: DEFAULT_INITIAL_WINDOW_SIZE + 10 ,
2073+ ) )
2074+ . await ;
2075+ srv. recv_frame ( frames:: reset ( 3 ) . cancel ( ) ) . await ;
2076+ } ;
2077+
2078+ let h2 = async move {
2079+ let ( mut client, mut h2) = client:: handshake ( io) . await . unwrap ( ) ;
2080+ let request = Request :: builder ( )
2081+ . method ( Method :: POST )
2082+ . uri ( "https://www.example.com/" )
2083+ . body ( ( ) )
2084+ . unwrap ( ) ;
2085+
2086+ let ( response1, mut stream1) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2087+ stream1. send_data ( "hello" . into ( ) , false ) . unwrap ( ) ;
2088+ let ( _, mut stream2) = client. send_request ( request. clone ( ) , false ) . unwrap ( ) ;
2089+ stream2. reserve_capacity ( frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ) ;
2090+ h2. drive ( response1) . await . unwrap ( ) ;
2091+ stream1. send_data ( "world" . into ( ) , true ) . unwrap ( ) ;
2092+ let stream2 = h2
2093+ . drive ( util:: wait_for_capacity (
2094+ stream2,
2095+ frame:: DEFAULT_INITIAL_WINDOW_SIZE as usize ,
2096+ ) )
2097+ . await ;
2098+ drop ( stream2) ;
2099+ h2. await . unwrap ( ) ;
2100+ } ;
2101+
2102+ join ( mock, h2) . await ;
2103+ }
2104+
19932105// ==== abusive window updates ====
19942106
19952107#[ tokio:: test]
0 commit comments