1 # frozen_string_literal: false
11 class TestPTY < Test::Unit::TestCase
12 RUBY = EnvUtil.rubybin
14 def test_spawn_without_block
15 r, w, pid = PTY.spawn(RUBY, '-e', 'puts "a"')
19 assert_equal("a\r\n", r.gets)
23 Process.wait pid if pid
26 def test_spawn_with_block
27 PTY.spawn(RUBY, '-e', 'puts "b"') {|r,w,pid|
29 assert_equal("b\r\n", r.gets)
41 commandline = Shellwords.join([RUBY, '-e', 'puts "foo"'])
42 PTY.spawn(commandline) {|r,w,pid|
44 assert_equal("foo\r\n", r.gets)
56 PTY.spawn([RUBY, "argv0"], '-e', 'puts "bar"') {|r,w,pid|
58 assert_equal("bar\r\n", r.gets)
69 def test_open_without_block
74 assert_kind_of(Array, ret)
75 assert_equal(2, ret.length)
76 assert_equal(IO, ret[0].class)
77 assert_equal(File, ret[1].class)
80 assert(File.chardev?(slave.path))
88 def test_open_with_block
93 assert_kind_of(Array, ret)
94 assert_equal(2, ret.length)
95 assert_equal(IO, ret[0].class)
96 assert_equal(File, ret[1].class)
99 assert(File.chardev?(slave.path))
110 def test_close_in_block
111 PTY.open {|master, slave|
114 assert(slave.closed?)
115 assert(master.closed?)
120 assert_nothing_raised {
121 PTY.open {|master, slave|
129 PTY.open {|master, slave|
131 assert_equal("foo", master.gets.chomp)
133 assert_equal("bar", slave.gets.chomp)
140 PTY.open {|master, slave|
141 s = File.stat(slave.path)
142 assert_equal(Process.uid, s.uid)
143 assert_equal(0600, s.mode & 0777)
149 def test_close_master
150 PTY.open {|master, slave|
152 assert_raise(EOFError) { slave.readpartial(10) }
159 PTY.open {|master, slave|
161 # This exception is platform dependent.
164 Errno::EIO # GNU/Linux
165 ) { master.readpartial(10) }
171 def test_getpty_nonexistent
172 bug3672 = '[ruby-dev:41965]'
173 Dir.mktmpdir do |tmpdir|
174 assert_raise(Errno::ENOENT, bug3672) {
176 PTY.getpty(File.join(tmpdir, "no-such-command"))
184 def test_pty_check_default
185 st1 = st2 = pid = nil
187 PTY.spawn("cat") do |r,w,id|
194 end until st2 = PTY.check(pid)
200 assert_equal(pid, st2.pid)
203 def test_pty_check_raise
204 bug2642 = '[ruby-dev:44600]'
205 st1 = st2 = pid = nil
206 PTY.spawn("cat") do |r,w,id|
208 assert_nothing_raised(PTY::ChildExited, bug2642) {st1 = PTY.check(pid, true)}
212 st2 = assert_raise(PTY::ChildExited, bug2642) {PTY.check(pid, true)}.status
218 assert_equal(pid, st2.pid)
223 assert(m.close_on_exec?)
224 assert(s.close_on_exec?)
226 PTY.spawn(RUBY, '-e', '') {|r, w, pid|
228 assert(r.close_on_exec?)
229 assert(w.close_on_exec?)