Skip to content

Commit

Permalink
runtime/internal/wasitest: skip racy TCP echo test
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
chriso authored and pull[bot] committed Feb 16, 2024
1 parent fc37c07 commit 2044205
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/runtime/internal/wasitest/tcpecho_test.go
Expand Up @@ -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++ {
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 2044205

Please sign in to comment.