hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

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:
Mtests/jev_provider_helper.mojo | 28+++++++++++++++++++++++++---
Mtests/test_jev.mojo | 47+++++++++++++++++++++++++----------------------
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()