Skip to content

Commit 789dcc6

Browse files
vtjnashIanButterworth
authored andcommitted
[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. (cherry picked from commit 64a86f9)
1 parent 2ccbfe6 commit 789dcc6

File tree

9 files changed

+34
-24
lines changed

9 files changed

+34
-24
lines changed

stdlib/Distributed/src/cluster.jl

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

233-
close_stdin && close(stdin) # workers will not use it
233+
if close_stdin # workers will not use it
234+
redirect_stdin(devnull)
235+
close(stdin)
236+
end
234237
stderr_to_stdout && redirect_stderr(stdout)
235238

236239
init_worker(cookie)

stdlib/Distributed/test/distributed_exec.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,11 @@ cluster_cookie("")
16191619
for close_stdin in (true, false), stderr_to_stdout in (true, false)
16201620
local npids = addprocs_with_testenv(RetainStdioTester(close_stdin,stderr_to_stdout))
16211621
@test remotecall_fetch(myid, npids[1]) == npids[1]
1622-
@test close_stdin != remotecall_fetch(()->isopen(stdin), npids[1])
1622+
if close_stdin
1623+
@test remotecall_fetch(()->stdin === devnull && !isreadable(stdin), npids[1])
1624+
else
1625+
@test remotecall_fetch(()->stdin !== devnull && isopen(stdin) && isreadable(stdin), npids[1])
1626+
end
16231627
@test stderr_to_stdout == remotecall_fetch(()->(stderr === stdout), npids[1])
16241628
rmprocs(npids)
16251629
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) < 1 && 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) < 1 && 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) < 1 && 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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +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
53+
radio_menu = RadioMenu(["apple", "banana", "cherry"]; keybindings=collect('a':'c'), charset=:ascii)
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)