2018-03-04 15:09:32 +00:00
|
|
|
require_relative '../../spec_helper'
|
|
|
|
require_relative 'fixtures/classes'
|
2017-05-07 12:04:49 +00:00
|
|
|
|
|
|
|
describe "IO#flush" do
|
|
|
|
it "raises IOError on closed stream" do
|
2019-07-27 12:40:09 +02:00
|
|
|
-> { IOSpecs.closed_io.flush }.should raise_error(IOError)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "on a pipe" do
|
|
|
|
before :each do
|
|
|
|
@r, @w = IO.pipe
|
|
|
|
end
|
|
|
|
|
|
|
|
after :each do
|
|
|
|
@r.close
|
|
|
|
begin
|
|
|
|
@w.close
|
|
|
|
rescue Errno::EPIPE
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# [ruby-core:90895] MJIT worker may leave fd open in a forked child.
|
|
|
|
# For instance, MJIT creates a worker before @r.close with fork(), @r.close happens,
|
|
|
|
# and the MJIT worker keeps the pipe open until the worker execve().
|
|
|
|
# TODO: consider acquiring GVL from MJIT worker.
|
2021-01-13 22:36:45 -08:00
|
|
|
guard_not -> { defined?(RubyVM::JIT) && RubyVM::JIT.enabled? } do
|
2019-07-27 12:40:09 +02:00
|
|
|
it "raises Errno::EPIPE if sync=false and the read end is closed" do
|
|
|
|
@w.sync = false
|
|
|
|
@w.write "foo"
|
|
|
|
@r.close
|
|
|
|
|
|
|
|
-> { @w.flush }.should raise_error(Errno::EPIPE, /Broken pipe/)
|
|
|
|
-> { @w.close }.should raise_error(Errno::EPIPE, /Broken pipe/)
|
|
|
|
end
|
|
|
|
end
|
2017-05-07 12:04:49 +00:00
|
|
|
end
|
|
|
|
end
|