@@ -391,7 +391,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
391
391
392
392
// The capacity should be immediately available as nothing else is
393
393
// 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 ;
395
395
396
396
let request = Request :: builder ( )
397
397
. method ( Method :: POST )
@@ -414,7 +414,7 @@ async fn stream_close_by_data_frame_releases_capacity() {
414
414
s1. send_data ( "" . into ( ) , true ) . unwrap ( ) ;
415
415
416
416
// The capacity should be available
417
- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
417
+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
418
418
419
419
// Send the frame
420
420
s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -461,9 +461,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
461
461
// This effectively reserves the entire connection window
462
462
s1. reserve_capacity ( window_size) ;
463
463
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 ;
467
465
468
466
let request = Request :: builder ( )
469
467
. method ( Method :: POST )
@@ -486,7 +484,7 @@ async fn stream_close_by_trailers_frame_releases_capacity() {
486
484
s1. send_trailers ( Default :: default ( ) ) . unwrap ( ) ;
487
485
488
486
// The capacity should be available
489
- assert_eq ! ( s2 . capacity ( ) , 5 ) ;
487
+ let mut s2 = h2 . drive ( util :: wait_for_capacity ( s2 , 5 ) ) . await ;
490
488
491
489
// Send the frame
492
490
s2. send_data ( "hello" . into ( ) , true ) . unwrap ( ) ;
@@ -919,10 +917,10 @@ async fn recv_no_init_window_then_receive_some_init_window() {
919
917
920
918
let ( response, mut stream) = client. send_request ( request, false ) . unwrap ( ) ;
921
919
922
- stream. reserve_capacity ( 11 ) ;
920
+ stream. reserve_capacity ( 10 ) ;
923
921
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 ) ;
926
924
927
925
stream. send_data ( "hello world" . into ( ) , true ) . unwrap ( ) ;
928
926
@@ -1990,6 +1988,61 @@ async fn reclaim_reserved_capacity() {
1990
1988
join ( mock, h2) . await ;
1991
1989
}
1992
1990
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
+
1993
2046
// ==== abusive window updates ====
1994
2047
1995
2048
#[ tokio:: test]
0 commit comments