@@ -222,3 +222,71 @@ async fn streaming_encoder_writer_propagates_inner_write_error() {
222222 assert_eq ! ( error. kind( ) , std:: io:: ErrorKind :: BrokenPipe ) ;
223223 assert ! ( !writer. is_failed( ) ) ;
224224}
225+
226+ #[ tokio:: test]
227+ async fn streaming_encoder_writer_round_trips_large_input_with_one_byte_backpressure ( ) {
228+ let input: Vec < u8 > = ( 0u8 ..=250 ) . cycle ( ) . take ( 5000 ) . collect ( ) ;
229+ let expected = STANDARD . encode_vec ( & input) . unwrap ( ) ;
230+ let inner = ScriptedWriter :: new ( ( 0 ..expected. len ( ) ) . map ( |_| WriteAction :: Accept ( 1 ) ) ) ;
231+ let mut writer = EncoderWriter :: new ( inner, STANDARD ) ;
232+
233+ writer. write_all ( & input) . await . unwrap ( ) ;
234+ writer. shutdown ( ) . await . unwrap ( ) ;
235+
236+ assert_eq ! ( writer. into_inner( ) . output( ) , expected) ;
237+ }
238+
239+ #[ tokio:: test]
240+ async fn streaming_decoder_writer_round_trips_large_input_with_one_byte_backpressure ( ) {
241+ let input: Vec < u8 > = ( 0u8 ..=250 ) . cycle ( ) . take ( 5000 ) . collect ( ) ;
242+ let encoded = STANDARD . encode_vec ( & input) . unwrap ( ) ;
243+ let inner = ScriptedWriter :: new ( ( 0 ..input. len ( ) ) . map ( |_| WriteAction :: Accept ( 1 ) ) ) ;
244+ let mut writer = DecoderWriter :: new ( inner, STANDARD ) ;
245+
246+ writer. write_all ( & encoded) . await . unwrap ( ) ;
247+ writer. shutdown ( ) . await . unwrap ( ) ;
248+
249+ assert_eq ! ( writer. into_inner( ) . output( ) , input) ;
250+ }
251+
252+ #[ tokio:: test]
253+ async fn streaming_encoder_writer_clamps_single_large_poll_write_to_queue_capacity ( ) {
254+ let input: Vec < u8 > = ( 0u8 ..=250 ) . cycle ( ) . take ( 2000 ) . collect ( ) ;
255+ let expected = STANDARD . encode_vec ( & input) . unwrap ( ) ;
256+ let mut writer = EncoderWriter :: new ( Vec :: new ( ) , STANDARD ) ;
257+ let waker = noop_waker ( ) ;
258+ let mut context = Context :: from_waker ( & waker) ;
259+
260+ let accepted = Pin :: new ( & mut writer)
261+ . poll_write ( & mut context, & input)
262+ . map ( |result| result. unwrap ( ) ) ;
263+
264+ assert_eq ! ( accepted, Poll :: Ready ( 768 ) ) ;
265+ assert_eq ! ( writer. buffered_output_len( ) , 1024 ) ;
266+
267+ writer. write_all ( & input[ 768 ..] ) . await . unwrap ( ) ;
268+ writer. shutdown ( ) . await . unwrap ( ) ;
269+
270+ assert_eq ! ( writer. into_inner( ) , expected) ;
271+ }
272+
273+ #[ tokio:: test]
274+ async fn streaming_decoder_writer_clamps_single_large_poll_write_to_queue_capacity ( ) {
275+ let input: Vec < u8 > = ( 0u8 ..=250 ) . cycle ( ) . take ( 2000 ) . collect ( ) ;
276+ let encoded = STANDARD . encode_vec ( & input) . unwrap ( ) ;
277+ let mut writer = DecoderWriter :: new ( Vec :: new ( ) , STANDARD ) ;
278+ let waker = noop_waker ( ) ;
279+ let mut context = Context :: from_waker ( & waker) ;
280+
281+ let accepted = Pin :: new ( & mut writer)
282+ . poll_write ( & mut context, & encoded)
283+ . map ( |result| result. unwrap ( ) ) ;
284+
285+ assert_eq ! ( accepted, Poll :: Ready ( 1364 ) ) ;
286+ assert_eq ! ( writer. buffered_output_len( ) , 1023 ) ;
287+
288+ writer. write_all ( & encoded[ 1364 ..] ) . await . unwrap ( ) ;
289+ writer. shutdown ( ) . await . unwrap ( ) ;
290+
291+ assert_eq ! ( writer. into_inner( ) , input) ;
292+ }
0 commit comments