@@ -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