diff options
Diffstat (limited to 'spec/ruby/core/process/spawn_spec.rb')
-rw-r--r-- | spec/ruby/core/process/spawn_spec.rb | 81 |
1 files changed, 58 insertions, 23 deletions
diff --git a/spec/ruby/core/process/spawn_spec.rb b/spec/ruby/core/process/spawn_spec.rb index e373d8600c..283a7f033d 100644 --- a/spec/ruby/core/process/spawn_spec.rb +++ b/spec/ruby/core/process/spawn_spec.rb @@ -212,6 +212,26 @@ describe "Process.spawn" do end.should output_to_fd("nil\n") end + platform_is_not :windows do + it "uses the passed env['PATH'] to search the executable" do + dir = tmp("spawn_path_dir") + mkdir_p dir + begin + exe = 'process-spawn-executable-in-path' + path = "#{dir}/#{exe}" + File.write(path, "#!/bin/sh\necho $1") + File.chmod(0755, path) + + env = { "PATH" => "#{dir}#{File::PATH_SEPARATOR}#{ENV['PATH']}" } + Process.wait Process.spawn(env, exe, 'OK', out: @name) + $?.should.success? + File.read(@name).should == "OK\n" + ensure + rm_r dir + end + end + end + it "calls #to_hash to convert the environment" do o = mock("to_hash") o.should_receive(:to_hash).and_return({"FOO" => "BAR"}) @@ -329,7 +349,7 @@ describe "Process.spawn" do pgid = Process.getpgid(Process.pid) # The process group is not available on all platforms. # See "man proc" - /proc/[pid]/stat - (5) pgrp - # In Travis arm64 environment, the value is 0. + # In Travis aarch64 environment, the value is 0. # # $ cat /proc/[pid]/stat # 19179 (ruby) S 19160 0 0 ... @@ -457,6 +477,16 @@ describe "Process.spawn" do # redirection + it 'redirects to the wrapped IO using wrapped_io.to_io if out: wrapped_io' do + File.open(@name, 'w') do |file| + -> do + wrapped_io = mock('wrapped IO') + wrapped_io.should_receive(:to_io).and_return(file) + Process.wait Process.spawn('echo Hello World', out: wrapped_io) + end.should output_to_fd("Hello World\n", file) + end + end + it "redirects STDOUT to the given file descriptor if out: Integer" do File.open(@name, 'w') do |file| -> do @@ -547,31 +577,36 @@ describe "Process.spawn" do end end + platform_is_not :windows do + it "redirects non-default file descriptor to itself" do + File.open(@name, 'w') do |file| + -> do + Process.wait Process.spawn( + ruby_cmd("f = IO.new(#{file.fileno}, 'w'); f.print(:bang); f.flush"), file.fileno => file.fileno) + end.should output_to_fd("bang", file) + end + end + end + + it "redirects default file descriptor to itself" do + -> do + Process.wait Process.spawn( + ruby_cmd("f = IO.new(#{STDOUT.fileno}, 'w'); f.print(:bang); f.flush"), STDOUT.fileno => STDOUT.fileno) + end.should output_to_fd("bang", STDOUT) + end + # :close_others platform_is_not :windows do context "defaults :close_others to" do - ruby_version_is ""..."2.6" do - it "true" do - IO.pipe do |r, w| - w.close_on_exec = false - code = "begin; IO.new(#{w.fileno}).close; rescue Errno::EBADF; puts 'not inherited'; end" - Process.wait Process.spawn(ruby_cmd(code), :out => @name) - File.read(@name).should == "not inherited\n" - end - end - end - - ruby_version_is "2.6" do - it "false" do - IO.pipe do |r, w| - w.close_on_exec = false - code = "io = IO.new(#{w.fileno}); io.puts('inherited'); io.close" - pid = Process.spawn(ruby_cmd(code)) - w.close - Process.wait(pid) - r.read.should == "inherited\n" - end + it "false" do + IO.pipe do |r, w| + w.close_on_exec = false + code = "io = IO.new(#{w.fileno}); io.puts('inherited'); io.close" + pid = Process.spawn(ruby_cmd(code)) + w.close + Process.wait(pid) + r.read.should == "inherited\n" end end end @@ -679,7 +714,7 @@ describe "Process.spawn" do end it "raises an Errno::EACCES or Errno::EISDIR when passed a directory" do - -> { Process.spawn File.dirname(__FILE__) }.should raise_error(SystemCallError) { |e| + -> { Process.spawn __dir__ }.should raise_error(SystemCallError) { |e| [Errno::EACCES, Errno::EISDIR].should include(e.class) } end |