Skip to content

Commit 622ed63

Browse files
committed
[Distributed] Set stdin to devnull before closing it
Distributed closes and destroys stdin, but some tests attempted to explicitly use it, leading to test problems. We previously interpreted this as passing devnull, but this is better to be explicit.
1 parent 559244b commit 622ed63

File tree

9 files changed

+33
-25
lines changed

9 files changed

+33
-25
lines changed

stdlib/Distributed/src/cluster.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,10 @@ start_worker(cookie::AbstractString=readline(stdin); kwargs...) = start_worker(s
232232
function start_worker(out::IO, cookie::AbstractString=readline(stdin); close_stdin::Bool=true, stderr_to_stdout::Bool=true)
233233
init_multi()
234234

235-
close_stdin && close(stdin) # workers will not use it
235+
if close_stdin # workers will not use it
236+
redirect_stdin(devnull)
237+
close(stdin)
238+
end
236239
stderr_to_stdout && redirect_stderr(stdout)
237240

238241
init_worker(cookie)

stdlib/Distributed/test/distributed_exec.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,11 @@ cluster_cookie("")
16161616
for close_stdin in (true, false), stderr_to_stdout in (true, false)
16171617
local npids = addprocs_with_testenv(RetainStdioTester(close_stdin,stderr_to_stdout))
16181618
@test remotecall_fetch(myid, npids[1]) == npids[1]
1619-
@test close_stdin != remotecall_fetch(()->isopen(stdin), npids[1])
1619+
if close_stdin
1620+
@test remotecall_fetch(()->stdin === devnull && !isreadable(stdin), npids[1])
1621+
else
1622+
@test remotecall_fetch(()->stdin !== devnull && isopen(stdin) && isreadable(stdin), npids[1])
1623+
end
16201624
@test stderr_to_stdout == remotecall_fetch(()->(stderr === stdout), npids[1])
16211625
rmprocs(npids)
16221626
end

stdlib/REPL/src/TerminalMenus/util.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,24 @@ readbyte(stream::IO=stdin) = read(stream, Char)
1717
# Read the next key from stdin. It is also able to read several bytes for
1818
# escaped keys such as the arrow keys, home/end keys, etc.
1919
# Escaped keys are returned using the `Key` enum.
20-
readkey(stream::Base.LibuvStream=stdin) = UInt32(_readkey(stream))
21-
function _readkey(stream::Base.LibuvStream=stdin)
20+
readkey(stream::IO=stdin) = UInt32(_readkey(stream))
21+
function _readkey(stream::IO=stdin)
2222
c = readbyte(stream)
2323

2424
# Escape characters
2525
if c == '\x1b'
26-
stream.buffer.size < 2 && return '\x1b'
26+
bytesavailable(stream) < 2 && return '\x1b'
2727
esc_a = readbyte(stream)
2828
esc_a == 'v' && return PAGE_UP # M-v
2929
esc_a == '<' && return HOME_KEY # M-<
3030
esc_a == '>' && return END_KEY # M->
3131

32-
stream.buffer.size < 3 && return '\x1b'
32+
bytesavailable(stream) < 3 && return '\x1b'
3333
esc_b = readbyte(stream)
3434

3535
if esc_a == '[' || esc_a == 'O'
3636
if esc_b >= '0' && esc_b <= '9'
37-
stream.buffer.size < 4 && return '\x1b'
37+
bytesavailable(stream) < 4 && return '\x1b'
3838
esc_c = readbyte(stream)
3939
if esc_c == '~'
4040
esc_b == '1' && return HOME_KEY

stdlib/REPL/test/TerminalMenus/legacytests/old_multiselect_menu.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ TerminalMenus.writeLine(buf, multi_menu, 1, true)
3333

3434
# Test SDTIN
3535
multi_menu = MultiSelectMenu(string.(1:10), warn=false)
36-
@test simulate_input(Set([1,2]), multi_menu, :enter, :down, :enter, 'd')
36+
@test simulate_input(multi_menu, :enter, :down, :enter, 'd') == Set([1,2])
3737
multi_menu = MultiSelectMenu(["single option"], warn=false)
38-
@test simulate_input(Set([1]), multi_menu, :up, :up, :down, :enter, 'd')
38+
@test simulate_input(multi_menu, :up, :up, :down, :enter, 'd') == Set([1])

stdlib/REPL/test/TerminalMenus/legacytests/old_radio_menu.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ TerminalMenus.writeLine(buf, radio_menu, 1, true)
3636

3737
# Test using stdin
3838
radio_menu = RadioMenu(string.(1:10), warn=false)
39-
@test simulate_input(3, radio_menu, :down, :down, :enter)
39+
@test simulate_input(radio_menu, :down, :down, :enter) == 3
4040
radio_menu = RadioMenu(["single option"], warn=false)
41-
@test simulate_input(1, radio_menu, :up, :up, :down, :up, :enter)
41+
@test simulate_input(radio_menu, :up, :up, :down, :up, :enter) == 1
4242
radio_menu = RadioMenu(string.(1:3), pagesize=1, warn=false)
43-
@test simulate_input(3, radio_menu, :down, :down, :down, :down, :enter)
43+
@test simulate_input(radio_menu, :down, :down, :down, :down, :enter) == 3

stdlib/REPL/test/TerminalMenus/multiselect_menu.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ end
5252

5353
# Test SDTIN
5454
multi_menu = MultiSelectMenu(string.(1:10), charset=:ascii)
55-
@test simulate_input(Set([1,2]), multi_menu, :enter, :down, :enter, 'd')
55+
@test simulate_input(multi_menu, :enter, :down, :enter, 'd') == Set([1,2])
5656
multi_menu = MultiSelectMenu(["single option"], charset=:ascii)
57-
@test simulate_input(Set([1]), multi_menu, :up, :up, :down, :enter, 'd')
57+
@test simulate_input(multi_menu, :up, :up, :down, :enter, 'd') == Set([1])

stdlib/REPL/test/TerminalMenus/multiselect_with_skip_menu.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ menu = MultiSelectWithSkipMenu(string.(1:5), selected=[2, 3])
121121
buf = IOBuffer()
122122
TerminalMenus.printmenu(buf, menu, 1; init=true)
123123
@test occursin("2 items selected", String(take!(buf)))
124-
@test simulate_input(Set([2, 3, 4]), menu, 'n', :enter, 'd')
124+
@test simulate_input(menu, 'n', :enter, 'd') == Set([2, 3, 4])
125125
buf = IOBuffer()
126126
TerminalMenus.printmenu(buf, menu, 1; init=true)
127127
@test occursin("3 items selected", String(take!(buf)))
128128

129129
menu = MultiSelectWithSkipMenu(string.(1:5), selected=[2, 3])
130-
@test simulate_input(Set([2]), menu, 'P', :enter, 'd', cursor=5)
130+
@test simulate_input(menu, 'P', :enter, 'd', cursor=5) == Set([2])

stdlib/REPL/test/TerminalMenus/radio_menu.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ end
4545

4646
# Test using stdin
4747
radio_menu = RadioMenu(string.(1:10); charset=:ascii)
48-
@test simulate_input(3, radio_menu, :down, :down, :enter)
48+
@test simulate_input(radio_menu, :down, :down, :enter) == 3
4949
radio_menu = RadioMenu(["single option"], charset=:ascii)
50-
@test simulate_input(1, radio_menu, :up, :up, :down, :up, :enter)
50+
@test simulate_input(radio_menu, :up, :up, :down, :up, :enter) == 1
5151
radio_menu = RadioMenu(string.(1:3), pagesize=1, charset=:ascii)
52-
@test simulate_input(3, radio_menu, :down, :down, :down, :down, :enter)
52+
@test simulate_input(radio_menu, :down, :down, :down, :down, :enter) == 3
5353
radio_menu = RadioMenu(["apple", "banana", "cherry"]; keybindings=collect('a':'c'), charset=:ascii)
54-
@test simulate_input(2, radio_menu, 'b')
54+
@test simulate_input(radio_menu, 'b') == 2

stdlib/REPL/test/TerminalMenus/runtests.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,22 @@ import REPL
44
using REPL.TerminalMenus
55
using Test
66

7-
function simulate_input(expected, menu::TerminalMenus.AbstractMenu, keys...;
8-
kwargs...)
7+
function simulate_input(menu::TerminalMenus.AbstractMenu, keys...; kwargs...)
98
keydict = Dict(:up => "\e[A",
109
:down => "\e[B",
1110
:enter => "\r")
1211

12+
new_stdin = Base.BufferStream()
1313
for key in keys
1414
if isa(key, Symbol)
15-
write(stdin.buffer, keydict[key])
15+
write(new_stdin, keydict[key])
1616
else
17-
write(stdin.buffer, "$key")
17+
write(new_stdin, "$key")
1818
end
1919
end
20+
TerminalMenus.terminal.in_stream = new_stdin
2021

21-
request(menu; suppress_output=true, kwargs...) == expected
22+
return request(menu; suppress_output=true, kwargs...)
2223
end
2324

2425
include("radio_menu.jl")

0 commit comments

Comments
 (0)