1
0
mirror of https://github.com/golang/go synced 2024-09-30 04:34:33 -06:00

runtime/internal/wasitest: skip racy TCP echo test

The wasip1 TCP echo test introduced in CL 493358 has a race
condition with port selection. The test runner probes for a free
port and then asks the WASM runtime to listen on the port, which
may be taken by another process in the interim.

Due to limitations with WASI preview 1, the guest is unable to
query the port it's listening on. The test cannot ask the WASM
runtime to listen on port 0 (choose a free port) since there's
currently no way for the test to query the selected port and
connect to it.

Given the race condition is unavoidable, this test is now disabled
by default and requires opt-in via an environment variable.

This commit also eliminates the hard-coded connection timeout.

Fixes #61820.

Change-Id: I375145c1a1d03ad45c44f528da3347397e6dcb01
Reviewed-on: https://go-review.googlesource.com/c/go/+/519895
Run-TryBot: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
This commit is contained in:
Chris O'Hara 2023-08-16 11:14:53 +10:00 committed by Johan Brandhorst-Satzkorn
parent e8a767b609
commit 795e779610

View File

@ -20,13 +20,18 @@ func TestTCPEcho(t *testing.T) {
t.Skip()
}
// We're unable to pass port 0 here (let the OS choose a spare port).
// Although wasmtime accepts port 0, and testdata/main.go successfully
// listens, there's no way for this test case to query the chosen port
// We're unable to use port 0 here (let the OS choose a spare port).
// Although the WASM runtime accepts port 0, and the WASM module listens
// successfully, there's no way for this test to query the selected port
// so that it can connect to the WASM module. The WASM module itself
// cannot access any information about the socket due to limitations
// with WASI preview 1 networking, and wasmtime does not log the address
// when you preopen a socket. Instead, we probe for a free port here.
// with WASI preview 1 networking, and the WASM runtimes do not log the
// port when you pre-open a socket. So, we probe for a free port here.
// Given there's an unavoidable race condition, the test is disabled by
// default.
if os.Getenv("GOWASIENABLERACYTEST") != "1" {
t.Skip("skipping WASI test with unavoidable race condition")
}
var host string
port := rand.Intn(10000) + 40000
for attempts := 0; attempts < 10; attempts++ {
@ -64,7 +69,7 @@ func TestTCPEcho(t *testing.T) {
var conn net.Conn
var err error
for attempts := 0; attempts < 5; attempts++ {
for {
conn, err = net.Dial("tcp", host)
if err == nil {
break