@@ -491,40 +491,61 @@ def setup_stream_test(component_count: 2)
491491 expect ( gaps . all? { |gap | gap >= 0.04 } ) . to be true
492492 end
493493
494- it "stops writing when client disconnects" do
495- queues , controller , stream = setup_stream_test ( component_count : 1 )
494+ describe "client disconnect handling" do
495+ it "stops writing on IOError" do
496+ queues , controller , stream = setup_stream_test ( component_count : 1 )
496497
497- written_chunks = [ ]
498- write_count = 0
498+ written_chunks = [ ]
499+ write_count = 0
499500
500- # Simulate client disconnect: IOError on third write
501- allow ( stream ) . to receive ( :write ) do |chunk |
502- write_count += 1
503- raise IOError , "client disconnected" if write_count == 3
501+ allow ( stream ) . to receive ( :write ) do |chunk |
502+ write_count += 1
503+ raise IOError , "client disconnected" if write_count == 3
504504
505- written_chunks << chunk
506- end
505+ written_chunks << chunk
506+ end
507507
508- # closed? stub required by setup but not used by StreamController's simple enqueue logic
509- allow ( stream ) . to receive ( :closed? ) . and_return ( false )
508+ run_stream ( controller ) do |_parent |
509+ queues [ 0 ] . enqueue ( "Chunk1" )
510+ sleep 0.05
511+ queues [ 0 ] . enqueue ( "Chunk2" )
512+ sleep 0.05
513+ queues [ 0 ] . enqueue ( "Chunk3" )
514+ sleep 0.05
515+ queues [ 0 ] . enqueue ( "Chunk4" )
516+ queues [ 0 ] . close
517+ sleep 0.1
518+ end
510519
511- run_stream ( controller ) do |_parent |
512- queues [ 0 ] . enqueue ( "Chunk1" )
513- sleep 0.05
514- queues [ 0 ] . enqueue ( "Chunk2" )
515- sleep 0.05
516- queues [ 0 ] . enqueue ( "Chunk3" ) # This write will raise IOError
517- sleep 0.05
518- queues [ 0 ] . enqueue ( "Chunk4" ) # Should not be written
519- queues [ 0 ] . close
520- sleep 0.1
520+ # Write 1: TEMPLATE, Write 2: Chunk1, Write 3: Chunk2 (raises IOError)
521+ expect ( written_chunks ) . to eq ( %w[ TEMPLATE Chunk1 ] )
521522 end
522523
523- # Writer catches IOError and stops - only successful writes recorded
524- # Write 1: TEMPLATE (success), Write 2: Chunk1 (success), Write 3: Chunk2 (IOError)
525- expect ( written_chunks . length ) . to eq ( 2 )
526- expect ( written_chunks ) . to include ( "TEMPLATE" )
527- expect ( written_chunks ) . to include ( "Chunk1" )
524+ it "stops writing on Errno::EPIPE" do
525+ queues , controller , stream = setup_stream_test ( component_count : 1 )
526+
527+ written_chunks = [ ]
528+ write_count = 0
529+
530+ allow ( stream ) . to receive ( :write ) do |chunk |
531+ write_count += 1
532+ raise Errno ::EPIPE , "broken pipe" if write_count == 3
533+
534+ written_chunks << chunk
535+ end
536+
537+ run_stream ( controller ) do |_parent |
538+ queues [ 0 ] . enqueue ( "Chunk1" )
539+ sleep 0.05
540+ queues [ 0 ] . enqueue ( "Chunk2" )
541+ sleep 0.05
542+ queues [ 0 ] . enqueue ( "Chunk3" )
543+ queues [ 0 ] . close
544+ sleep 0.1
545+ end
546+
547+ expect ( written_chunks ) . to eq ( %w[ TEMPLATE Chunk1 ] )
548+ end
528549 end
529550 end
530551end
0 commit comments