Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions spec/unit/wasi_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -754,14 +754,18 @@ def tempfile_path(name)
# This server cannot run in a thread because the GVL is locked while the WASI IO
# is taking place
def spawn_tcp_server(port_file)
File.delete(port_file) if File.exist?(port_file)

Process.spawn(
RbConfig.ruby,
"-e",
<<~RUBY,
require "socket"
server = TCPServer.new("127.0.0.1", 0)
port = server.addr[1]
File.write("#{port_file}", port.to_s)
temp_port_file = "#{port_file}.tmp"
File.write(temp_port_file, port.to_s)
File.rename(temp_port_file, "#{port_file}")
loop do
client = server.accept
data = client.read(5)
Expand All @@ -778,6 +782,8 @@ def spawn_tcp_server(port_file)
# This server cannot run in a thread because the GVL is locked while the WASI IO
# is taking place
def spawn_udp_server(port_file)
File.delete(port_file) if File.exist?(port_file)

Process.spawn(
RbConfig.ruby,
"-e",
Expand All @@ -786,7 +792,9 @@ def spawn_udp_server(port_file)
server = UDPSocket.new
server.bind("127.0.0.1", 0)
port = server.addr[1]
File.write("#{port_file}", port.to_s)
temp_port_file = "#{port_file}.tmp"
File.write(temp_port_file, port.to_s)
File.rename(temp_port_file, "#{port_file}")
loop do
data, addr = server.recvfrom(100)
server.send("WORLD", 0, addr[3], addr[1]) if data == "HELLO"
Expand All @@ -797,16 +805,19 @@ def spawn_udp_server(port_file)
)
end

# Wait for the port file to be written and return the port number
# Wait for the server to atomically publish its port and return it.
def wait_for_port(port_file, timeout: 5)
start_time = Time.now
until File.exist?(port_file)
sleep 0.01
if Time.now - start_time > timeout
deadline = Time.now + timeout

loop do
return File.read(port_file).to_i if File.exist?(port_file)

if Time.now > deadline
raise "Timeout waiting for server to write port file: #{port_file}"
end

sleep 0.01
end
File.read(port_file).to_i
end

# Clean up a spawned server process
Expand Down
Loading