2018-03-04 10:09:32 -05:00
|
|
|
require_relative '../../spec_helper'
|
|
|
|
require_relative 'fixtures/classes'
|
2017-05-07 08:04:49 -04:00
|
|
|
|
|
|
|
describe "IO#flush" do
|
|
|
|
it "raises IOError on closed stream" do
|
2019-07-27 06:40:09 -04: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.
|
|
|
|
guard_not -> { defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? } do
|
|
|
|
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 08:04:49 -04:00
|
|
|
end
|
|
|
|
end
|