mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 bcaf84e89c
			
		
	
	
		bcaf84e89c
		
	
	
	
	
		
			
			Because both assert_equal and assert_nil do not pass at the same time. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63639 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			239 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: false
 | |
| require 'test/unit'
 | |
| require 'shellwords'
 | |
| require 'tmpdir'
 | |
| 
 | |
| begin
 | |
|   require 'pty'
 | |
| rescue LoadError
 | |
| end
 | |
| 
 | |
| class TestPTY < Test::Unit::TestCase
 | |
|   RUBY = EnvUtil.rubybin
 | |
| 
 | |
|   def test_spawn_without_block
 | |
|     r, w, pid = PTY.spawn(RUBY, '-e', 'puts "a"')
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert_equal("a\r\n", r.gets)
 | |
|   ensure
 | |
|     r&.close
 | |
|     w&.close
 | |
|     Process.wait pid if pid
 | |
|   end
 | |
| 
 | |
|   def test_spawn_with_block
 | |
|     PTY.spawn(RUBY, '-e', 'puts "b"') {|r,w,pid|
 | |
|       begin
 | |
|         assert_equal("b\r\n", r.gets)
 | |
|       ensure
 | |
|         r.close
 | |
|         w.close
 | |
|         Process.wait(pid)
 | |
|       end
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_commandline
 | |
|     commandline = Shellwords.join([RUBY, '-e', 'puts "foo"'])
 | |
|     PTY.spawn(commandline) {|r,w,pid|
 | |
|       begin
 | |
|         assert_equal("foo\r\n", r.gets)
 | |
|       ensure
 | |
|         r.close
 | |
|         w.close
 | |
|         Process.wait(pid)
 | |
|       end
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_argv0
 | |
|     PTY.spawn([RUBY, "argv0"], '-e', 'puts "bar"') {|r,w,pid|
 | |
|       begin
 | |
|         assert_equal("bar\r\n", r.gets)
 | |
|       ensure
 | |
|         r.close
 | |
|         w.close
 | |
|         Process.wait(pid)
 | |
|       end
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_open_without_block
 | |
|     ret = PTY.open
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert_kind_of(Array, ret)
 | |
|     assert_equal(2, ret.length)
 | |
|     assert_equal(IO, ret[0].class)
 | |
|     assert_equal(File, ret[1].class)
 | |
|     _, slave = ret
 | |
|     assert(slave.tty?)
 | |
|     assert(File.chardev?(slave.path))
 | |
|   ensure
 | |
|     if ret
 | |
|       ret[0].close
 | |
|       ret[1].close
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_open_with_block
 | |
|     r = nil
 | |
|     x = Object.new
 | |
|     y = PTY.open {|ret|
 | |
|       r = ret;
 | |
|       assert_kind_of(Array, ret)
 | |
|       assert_equal(2, ret.length)
 | |
|       assert_equal(IO, ret[0].class)
 | |
|       assert_equal(File, ret[1].class)
 | |
|       _, slave = ret
 | |
|       assert(slave.tty?)
 | |
|       assert(File.chardev?(slave.path))
 | |
|       x
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert(r[0].closed?)
 | |
|     assert(r[1].closed?)
 | |
|     assert_equal(y, x)
 | |
|   end
 | |
| 
 | |
|   def test_close_in_block
 | |
|     PTY.open {|master, slave|
 | |
|       slave.close
 | |
|       master.close
 | |
|       assert(slave.closed?)
 | |
|       assert(master.closed?)
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert_nothing_raised {
 | |
|       PTY.open {|master, slave|
 | |
|         slave.close
 | |
|         master.close
 | |
|       }
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def test_open
 | |
|     PTY.open {|master, slave|
 | |
|       slave.puts "foo"
 | |
|       assert_equal("foo", master.gets.chomp)
 | |
|       master.puts "bar"
 | |
|       assert_equal("bar", slave.gets.chomp)
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_stat_slave
 | |
|     PTY.open {|master, slave|
 | |
|       s =  File.stat(slave.path)
 | |
|       assert_equal(Process.uid, s.uid)
 | |
|       assert_equal(0600, s.mode & 0777)
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_close_master
 | |
|     PTY.open {|master, slave|
 | |
|       master.close
 | |
|       assert_raise(EOFError) { slave.readpartial(10) }
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_close_slave
 | |
|     PTY.open {|master, slave|
 | |
|       slave.close
 | |
|       # This exception is platform dependent.
 | |
|       assert_raise(
 | |
|         EOFError,       # FreeBSD
 | |
|         Errno::EIO      # GNU/Linux
 | |
|       ) { master.readpartial(10) }
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| 
 | |
|   def test_getpty_nonexistent
 | |
|     bug3672 = '[ruby-dev:41965]'
 | |
|     Dir.mktmpdir do |tmpdir|
 | |
|       assert_raise(Errno::ENOENT, bug3672) {
 | |
|         begin
 | |
|           PTY.getpty(File.join(tmpdir, "no-such-command"))
 | |
|         rescue RuntimeError
 | |
|           skip $!
 | |
|         end
 | |
|       }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_pty_check_default
 | |
|     st1 = st2 = pid = nil
 | |
|     `echo` # preset $?
 | |
|     PTY.spawn("cat") do |r,w,id|
 | |
|       pid = id
 | |
|       st1 = PTY.check(pid)
 | |
|       w.close
 | |
|       r.close
 | |
|       begin
 | |
|         sleep(0.1)
 | |
|       end until st2 = PTY.check(pid)
 | |
|     end
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert_nil(st1)
 | |
|     assert_equal(pid, st2.pid)
 | |
|   end
 | |
| 
 | |
|   def test_pty_check_raise
 | |
|     bug2642 = '[ruby-dev:44600]'
 | |
|     st1 = st2 = pid = nil
 | |
|     PTY.spawn("cat") do |r,w,id|
 | |
|       pid = id
 | |
|       assert_nothing_raised(PTY::ChildExited, bug2642) {st1 = PTY.check(pid, true)}
 | |
|       w.close
 | |
|       r.close
 | |
|       sleep(0.1)
 | |
|       st2 = assert_raise(PTY::ChildExited, bug2642) {PTY.check(pid, true)}.status
 | |
|     end
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   else
 | |
|     assert_nil(st1)
 | |
|     assert_equal(pid, st2.pid)
 | |
|   end
 | |
| 
 | |
|   def test_cloexec
 | |
|     PTY.open {|m, s|
 | |
|       assert(m.close_on_exec?)
 | |
|       assert(s.close_on_exec?)
 | |
|     }
 | |
|     PTY.spawn(RUBY, '-e', '') {|r, w, pid|
 | |
|       begin
 | |
|         assert(r.close_on_exec?)
 | |
|         assert(w.close_on_exec?)
 | |
|       ensure
 | |
|         r.close
 | |
|         w.close
 | |
|         Process.wait(pid)
 | |
|       end
 | |
|     }
 | |
|   rescue RuntimeError
 | |
|     skip $!
 | |
|   end
 | |
| end if defined? PTY
 |