2017-05-07 08:04:49 -04:00
|
|
|
describe :process_fork, shared: true do
|
|
|
|
platform_is :windows do
|
|
|
|
it "returns false from #respond_to?" do
|
|
|
|
# Workaround for Kernel::Method being public and losing the "non-respond_to? magic"
|
|
|
|
mod = @object.class.name == "KernelSpecs::Method" ? Object.new : @object
|
|
|
|
mod.respond_to?(:fork).should be_false
|
|
|
|
mod.respond_to?(:fork, true).should be_false
|
|
|
|
end
|
|
|
|
|
|
|
|
it "raises a NotImplementedError when called" do
|
2019-07-27 06:40:09 -04:00
|
|
|
-> { @object.fork }.should raise_error(NotImplementedError)
|
2017-05-07 08:04:49 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
platform_is_not :windows do
|
|
|
|
before :each do
|
|
|
|
@file = tmp('i_exist')
|
|
|
|
rm_r @file
|
|
|
|
end
|
|
|
|
|
|
|
|
after :each do
|
|
|
|
rm_r @file
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns status zero" do
|
|
|
|
pid = Process.fork { exit! 0 }
|
|
|
|
_, result = Process.wait2(pid)
|
|
|
|
result.exitstatus.should == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns status zero" do
|
|
|
|
pid = Process.fork { exit 0 }
|
|
|
|
_, result = Process.wait2(pid)
|
|
|
|
result.exitstatus.should == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns status zero" do
|
|
|
|
pid = Process.fork {}
|
|
|
|
_, result = Process.wait2(pid)
|
|
|
|
result.exitstatus.should == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns status non-zero" do
|
|
|
|
pid = Process.fork { exit! 42 }
|
|
|
|
_, result = Process.wait2(pid)
|
|
|
|
result.exitstatus.should == 42
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns status non-zero" do
|
|
|
|
pid = Process.fork { exit 42 }
|
|
|
|
_, result = Process.wait2(pid)
|
|
|
|
result.exitstatus.should == 42
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns nil for the child process" do
|
|
|
|
child_id = @object.fork
|
|
|
|
if child_id == nil
|
|
|
|
touch(@file) { |f| f.write 'rubinius' }
|
|
|
|
Process.exit!
|
|
|
|
else
|
|
|
|
Process.waitpid(child_id)
|
|
|
|
end
|
2019-09-29 13:13:37 -04:00
|
|
|
File.should.exist?(@file)
|
2017-05-07 08:04:49 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "runs a block in a child process" do
|
|
|
|
pid = @object.fork {
|
|
|
|
touch(@file) { |f| f.write 'rubinius' }
|
|
|
|
Process.exit!
|
|
|
|
}
|
|
|
|
Process.waitpid(pid)
|
2019-09-29 13:13:37 -04:00
|
|
|
File.should.exist?(@file)
|
2017-05-07 08:04:49 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "marks threads from the parent as killed" do
|
|
|
|
t = Thread.new { sleep }
|
|
|
|
pid = @object.fork {
|
|
|
|
touch(@file) do |f|
|
|
|
|
f.write Thread.current.alive?
|
|
|
|
f.write t.alive?
|
|
|
|
end
|
|
|
|
Process.exit!
|
|
|
|
}
|
|
|
|
Process.waitpid(pid)
|
|
|
|
t.kill
|
|
|
|
t.join
|
|
|
|
File.read(@file).should == "truefalse"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|