77end
88
99class TestIO_Console < Test ::Unit ::TestCase
10+ HOST_OS = RbConfig ::CONFIG [ 'host_os' ]
11+ private def host_os? ( os )
12+ HOST_OS =~ os
13+ end
14+
1015 begin
1116 PATHS = $LOADED_FEATURES. grep ( %r"/io/console(?:\. #{ RbConfig ::CONFIG [ 'DLEXT' ] } |\. rb|/\w +\. rb)\z " ) { $`}
1217 rescue Encoding ::CompatibilityError
@@ -20,17 +25,13 @@ class TestIO_Console < Test::Unit::TestCase
2025 # FreeBSD seems to hang on TTOU when running parallel tests
2126 # tested on FreeBSD 11.x.
2227 #
23- # Solaris gets stuck too, even in non-parallel mode.
24- # It occurs only in chkbuild. It does not occur when running
25- # `make test-all` in SSH terminal.
26- #
2728 # I suspect that it occurs only when having no TTY.
2829 # (Parallel mode runs tests in child processes, so I guess
2930 # they has no TTY.)
3031 # But it does not occur in `make test-all > /dev/null`, so
3132 # there should be an additional factor, I guess.
3233 def set_winsize_setup
33- @old_ttou = trap ( :TTOU , 'IGNORE' ) if RUBY_PLATFORM =~ /freebsd|solaris/i
34+ @old_ttou = trap ( :TTOU , 'IGNORE' ) if host_os? ( /freebsd/ )
3435 end
3536
3637 def set_winsize_teardown
@@ -371,6 +372,15 @@ def assert_ctrl(expect, cc, r, w)
371372 w . print cc
372373 w . flush
373374 result = EnvUtil . timeout ( 3 ) { r . gets }
375+ if result
376+ case cc . chr
377+ when "\C -A" .."\C -_"
378+ cc = "^" + ( cc . ord | 0x40 ) . chr
379+ when "\C -?"
380+ cc = "^?"
381+ end
382+ result . sub! ( cc , "" )
383+ end
374384 assert_equal ( expect , result . chomp )
375385 end
376386
@@ -382,7 +392,7 @@ def test_intr
382392 # TestIO_Console#test_intr [/usr/home/chkbuild/chkbuild/tmp/build/20220304T163001Z/ruby/test/io/console/test_io_console.rb:387]:
383393 # <"25"> expected but was
384394 # <"-e:12:in `p': \e[1mexecution expired (\e[1;4mTimeout::Error\e[m\e[1m)\e[m">.
385- omit if /freebsd/ =~ RUBY_PLATFORM
395+ omit if host_os? ( /freebsd/ )
386396
387397 run_pty ( "#{ <<~"begin;" } \n #{ <<~'end;' } " ) do |r , w , _ |
388398 begin;
@@ -408,7 +418,7 @@ def test_intr
408418 if cc = ctrl [ "intr" ]
409419 assert_ctrl ( "#{ cc . ord } " , cc , r , w )
410420 assert_ctrl ( "#{ cc . ord } " , cc , r , w )
411- assert_ctrl ( "Interrupt" , cc , r , w ) unless /linux|solaris/ =~ RUBY_PLATFORM
421+ assert_ctrl ( "Interrupt" , cc , r , w ) unless host_os? ( /linux/ )
412422 end
413423 if cc = ctrl [ "dsusp" ]
414424 assert_ctrl ( "#{ cc . ord } " , cc , r , w )
@@ -444,7 +454,9 @@ def test_sync
444454
445455 def test_ttyname
446456 return unless IO . method_defined? ( :ttyname )
447- assert_equal ( [ "true" ] , run_pty ( "p STDIN.ttyname == STDOUT.ttyname" ) )
457+ # [Bug #20682]
458+ # `sleep 0.1` is added to stabilize flaky failures on macOS.
459+ assert_equal ( [ "true" ] , run_pty ( "p STDIN.ttyname == STDOUT.ttyname; sleep 0.1" ) )
448460 end
449461 end
450462
@@ -544,9 +556,7 @@ def test_ttyname
544556 File . open ( ttyname ) { |f | assert_predicate ( f , :tty? ) }
545557 end
546558 end
547- end
548559
549- defined? ( IO . console ) and TestIO_Console . class_eval do
550560 case
551561 when Process . respond_to? ( :daemon )
552562 noctty = [ EnvUtil . rubybin , "-e" , "Process.daemon(true)" ]
0 commit comments