stress.jl
# This file is a part of Julia. License is MIT: https://julialang.org/license
# test for proper handling of FD exhaustion
if Sys.isunix()
# Run this test with a really small ulimit. If the ulimit is too high,
# we might saturate kernel resources (See #23143)
run(`sh -c "ulimit -n 100; $(Base.shell_escape(Base.julia_cmd())) --startup-file=no $(joinpath(@__DIR__, "stress_fd_exec.jl"))"`)
end
# issue 13559
if !Sys.iswindows()
function test_13559()
fn = tempname()
run(`mkfifo $fn`)
# use subprocess to write 127 bytes to FIFO
writer_cmds = """
using Test
x = open($(repr(fn)), "w")
for i in 1:120
write(x, 0xaa)
end
flush(x)
Test.@test read(stdin, Int8) == 31
for i in 1:7
write(x, 0xaa)
end
close(x)
"""
p = open(pipeline(`$(Base.julia_cmd()) --startup-file=no -e $writer_cmds`, stderr=stderr), "w")
# quickly read FIFO, draining it and blocking but not failing with EOFError yet
r = open(fn, "r")
# 15 proper reads
for i in 1:15
@test read(r, UInt64) === 0xaaaaaaaaaaaaaaaa
end
write(p, 0x1f)
# last read should throw EOFError when FIFO closes, since there are only 7 bytes (or less) available.
@test_throws EOFError read(r, UInt64)
close(r)
@test success(p)
rm(fn)
end
test_13559()
end
# issue #22566
if !Sys.iswindows()
function test_22566()
fn = tempname()
run(`mkfifo $fn`)
script = """
using Test
x = open($(repr(fn)), "w")
write(x, 0x42)
flush(x)
Test.@test read(stdin, Int8) == 21
close(x)
"""
cmd = `$(Base.julia_cmd()) --startup-file=no -e $script`
p = open(pipeline(cmd, stderr=stderr), "w")
r = open(fn, "r")
@test read(r, Int8) == 66
write(p, 0x15)
close(r)
@test success(p)
rm(fn)
end
# repeat opening/closing fifo file, ensure no EINTR popped out
for i = 1:50
test_22566()
end
end # !Sys.iswindows
# sig 2 is SIGINT per the POSIX.1-1990 standard
if !Sys.iswindows()
Base.exit_on_sigint(false)
@test_throws InterruptException begin
ccall(:kill, Cvoid, (Cint, Cint,), getpid(), 2)
for i in 1:10
Libc.systemsleep(0.1)
ccall(:jl_gc_safepoint, Cvoid, ()) # wait for SIGINT to arrive
end
end
Base.exit_on_sigint(true)
end