commit 8c7eb986263ccbf3e32d38747d023b196d2d2951
parent bf91819b0bb5ef12a318758aabaf4cee87c1132c
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 14:21:24 +0000
provider: bind loopback stub port in-child to avoid race
Diffstat:
2 files changed, 50 insertions(+), 25 deletions(-)
diff --git a/tests/jev_provider_helper.mojo b/tests/jev_provider_helper.mojo
@@ -157,7 +157,8 @@ def _handle(mut stream: TcpStream, mode: String) raises:
def _serve(port: Int, mode: String, requests: Int) raises:
var listener = TcpListener.bind(SocketAddr.localhost(UInt16(port)))
- _write(1, "ready\n")
+ var actual_port = Int(listener.local_addr().port)
+ _write(1, "ready " + String(actual_port) + "\n")
for _ in range(requests):
var stream = listener.accept()
try:
@@ -187,7 +188,24 @@ def reserve_jev_port() raises -> Int:
return port
+@fieldwise_init
+struct SpawnedJevStubAuto(Movable):
+ var port: Int
+ var stub: SpawnedJevStub
+
+
+def spawn_jev_stub_auto(mode: String, requests: Int) raises -> SpawnedJevStubAuto:
+ return _spawn_jev_stub(0, mode, requests)
+
+
def spawn_jev_stub(port: Int, mode: String, requests: Int) raises -> SpawnedJevStub:
+ var started = _spawn_jev_stub(port, mode, requests)
+ return started.stub^
+
+
+def _spawn_jev_stub(
+ port: Int, mode: String, requests: Int
+) raises -> SpawnedJevStubAuto:
var stdout_pipe = Pipe()
var stdout_read_fd = c_int(stdout_pipe.fd_in.value().value)
var stdout_write_fd = c_int(stdout_pipe.fd_out.value().value)
@@ -206,10 +224,14 @@ def spawn_jev_stub(port: Int, mode: String, requests: Int) raises -> SpawnedJevS
_exit_child(c_int(125))
stdout_pipe.set_input_only()
var ready_line = _read_pipe_line(stdout_pipe)
- if ready_line != "ready":
+ if not ready_line.startswith("ready"):
stdout_pipe.set_output_only()
var process = Process(Int(pid))
_ = process.wait()
raise Error("jev stub failed to report ready")
+ var reported_port = port
+ var space = ready_line.find(" ")
+ if space >= 0:
+ reported_port = Int(String(ready_line[byte=space + 1:]))
stdout_pipe.set_output_only()
- return SpawnedJevStub(Int(pid))
+ return SpawnedJevStubAuto(port=reported_port, stub=SpawnedJevStub(Int(pid)))
diff --git a/tests/test_jev.mojo b/tests/test_jev.mojo
@@ -245,48 +245,51 @@ def test_circuit_opens_and_recovers() raises:
from flare.http import HttpClient
-from jev_provider_helper import reserve_jev_port, spawn_jev_stub
+from jev_provider_helper import (
+ reserve_jev_port,
+ spawn_jev_stub_auto,
+)
def test_local_provider_server_serves_scripted_jev() raises:
- var port = reserve_jev_port()
- var stub = spawn_jev_stub(port, "ok", 1)
+ var started = spawn_jev_stub_auto("ok", 1)
+ var port = started.port
var url = "http://127.0.0.1:" + String(port) + "/v1/systemone"
with HttpClient(timeout_ms=5000, max_redirects=0) as client:
var response = client.post(url, '{"model":"jev-1.13.0","state":"s","questions":{}}')
assert_true(response.ok())
var body = response.json()
assert_equal(body["model"].string_value(), "jev-1.13.0")
- stub.wait()
+ started.stub.wait()
def test_local_provider_server_scripts_transport_failures() raises:
- var rate_port = reserve_jev_port()
- var rate_stub = spawn_jev_stub(rate_port, "rate_limit", 1)
+ var rate_port_started = spawn_jev_stub_auto("rate_limit", 1)
+ var rate_port = rate_port_started.port
with HttpClient(timeout_ms=5000, max_redirects=0) as client:
var response = client.post(
"http://127.0.0.1:" + String(rate_port) + "/v1/systemone", "{}"
)
assert_equal(response.status, 429)
- rate_stub.wait()
+ rate_port_started.stub.wait()
- var malformed_port = reserve_jev_port()
- var malformed_stub = spawn_jev_stub(malformed_port, "malformed_json", 1)
+ var malformed_port_started = spawn_jev_stub_auto("malformed_json", 1)
+ var malformed_port = malformed_port_started.port
with HttpClient(timeout_ms=5000, max_redirects=0) as client:
var response = client.post(
"http://127.0.0.1:" + String(malformed_port) + "/v1/systemone", "{}"
)
assert_equal(response.text(), "not json")
- malformed_stub.wait()
+ malformed_port_started.stub.wait()
- var err_port = reserve_jev_port()
- var err_stub = spawn_jev_stub(err_port, "server_error", 1)
+ var err_port_started = spawn_jev_stub_auto("server_error", 1)
+ var err_port = err_port_started.port
with HttpClient(timeout_ms=5000, max_redirects=0) as client:
var response = client.post(
"http://127.0.0.1:" + String(err_port) + "/v1/systemone", "{}"
)
assert_equal(response.status, 500)
- err_stub.wait()
+ err_port_started.stub.wait()
from hyf_provider.jev_client import post_jev_systemone, validate_jev_base_url
@@ -311,8 +314,8 @@ def test_jev_endpoint_policy_and_loopback_client() raises:
with assert_raises():
_ = validate_jev_base_url("ftp://api.typesafe.ai")
- var port = reserve_jev_port()
- var stub = spawn_jev_stub(port, "ok", 1)
+ var started = spawn_jev_stub_auto("ok", 1)
+ var port = started.port
var outcome = post_jev_systemone(
"http://127.0.0.1:" + String(port),
_loads('{"model":"jev-1.13.0","state":"s","questions":{}}'),
@@ -320,7 +323,7 @@ def test_jev_endpoint_policy_and_loopback_client() raises:
)
assert_equal(outcome.status, 200)
assert_true(outcome.body_text.find("jev-1.13.0") >= 0)
- stub.wait()
+ started.stub.wait()
from flare.tls import TlsVerify
@@ -340,14 +343,14 @@ def test_tls_and_redirect_policy() raises:
assert_tls_verification_required(TlsConfig.insecure())
assert_true(not redirects_forward_credentials())
- var port = reserve_jev_port()
- var stub = spawn_jev_stub(port, "redirect", 1)
+ var started = spawn_jev_stub_auto("redirect", 1)
+ var port = started.port
with assert_raises():
with HttpClient(timeout_ms=5000, max_redirects=0) as client:
_ = client.post(
"http://127.0.0.1:" + String(port) + "/v1/systemone", "{}"
)
- stub.wait()
+ started.stub.wait()
from hyf_provider.jev_client import failure_kind_for_status, retry_decision
@@ -370,15 +373,15 @@ def test_bounded_retry_and_budget_behavior() raises:
def test_transport_cleanup_and_local_cancellation() raises:
- var port = reserve_jev_port()
- var stub = spawn_jev_stub(port, "ok", 1)
+ var started = spawn_jev_stub_auto("ok", 1)
+ var port = started.port
var outcome = post_jev_systemone(
"http://127.0.0.1:" + String(port),
_loads('{"model":"jev-1.13.0","state":"s","questions":{}}'),
5000,
)
assert_equal(outcome.status, 200)
- stub.wait()
+ started.stub.wait()
# A refused connection is a bounded local transport failure (no listener).
var dead_port = reserve_jev_port()