File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -568,6 +568,9 @@ fn test_notebook_interrupt_at_breakpoint_exits_debugger() {
568568 // Shell reply arrives — kernel unblocked by the Q command
569569 frontend. recv_shell_execute_reply ( ) ;
570570
571+ // On Windows, interrupting R may emit a stray newline to stderr.
572+ frontend. allow_streams ( ) ;
573+
571574 // IOPub messages from the control thread (interrupt busy/idle) and
572575 // R thread (debug_event Continued, execute_request idle) race.
573576 let msgs = frontend. recv_iopub_interleaved ( & [
@@ -700,6 +703,9 @@ fn test_notebook_unexpected_browser_interrupt_via_stdin() {
700703
701704 // IOPub messages from the control thread (interrupt busy/idle) and
702705 // R thread (execute_request idle) race.
706+ // On Windows, interrupting R may emit a stray newline to stderr.
707+ frontend. allow_streams ( ) ;
708+
703709 frontend. recv_iopub_interleaved ( & [
704710 // Control thread: interrupt_request busy/idle
705711 & [ IopubExpectation :: BusyControl , IopubExpectation :: IdleControl ] ,
Original file line number Diff line number Diff line change @@ -141,6 +141,7 @@ fn test_dap_continue() {
141141/// In console mode, interrupt at a breakpoint sends SIGINT (not Q).
142142/// The debugger should remain active after the interrupt.
143143#[ test]
144+ #[ cfg_attr( target_os = "windows" , ignore) ]
144145fn test_dap_interrupt_at_breakpoint_stays_in_debugger ( ) {
145146 let frontend = DummyArkFrontend :: lock ( ) ;
146147 let mut dap = frontend. start_dap ( ) ;
Original file line number Diff line number Diff line change @@ -490,6 +490,14 @@ impl DummyArkFrontend {
490490 self . drain_streams_internal ( )
491491 }
492492
493+ /// Mark streams as handled without draining them from the socket.
494+ /// Use this when streams may arrive during an interleaved message block
495+ /// (e.g. a stray newline on stderr from Windows interrupt handling)
496+ /// and you don't want `flush_streams_at_boundary` to panic.
497+ pub fn allow_streams ( & self ) {
498+ self . streams_handled . set ( true ) ;
499+ }
500+
493501 /// Internal drain that doesn't set `streams_handled` (for use in Drop).
494502 fn drain_streams_internal ( & self ) -> DrainedStreams {
495503 let deadline = Instant :: now ( ) + default_drain_timeout ( ) ;
You can’t perform that action at this time.
0 commit comments