|
11 | 11 | from pathlib import Path |
12 | 12 |
|
13 | 13 |
|
14 | | -def _write_runtime_files(runtime_dir: Path, *, owner_pid: int) -> None: |
| 14 | +def _write_runtime_files( |
| 15 | + runtime_dir: Path, |
| 16 | + *, |
| 17 | + owner_pid: int, |
| 18 | + transport: str = "socket", |
| 19 | + address: str = "/tmp/kagan-core.sock", |
| 20 | + port: int | None = None, |
| 21 | +) -> None: |
15 | 22 | runtime_dir.mkdir(parents=True, exist_ok=True) |
16 | | - (runtime_dir / "endpoint.json").write_text( |
17 | | - json.dumps( |
18 | | - { |
19 | | - "transport": "socket", |
20 | | - "address": "/tmp/kagan-core.sock", |
21 | | - } |
22 | | - ), |
23 | | - encoding="utf-8", |
24 | | - ) |
| 23 | + endpoint_payload: dict[str, object] = {"transport": transport, "address": address} |
| 24 | + if port is not None: |
| 25 | + endpoint_payload["port"] = port |
| 26 | + (runtime_dir / "endpoint.json").write_text(json.dumps(endpoint_payload), encoding="utf-8") |
25 | 27 | (runtime_dir / "token").write_text("lease-token", encoding="utf-8") |
26 | 28 | (runtime_dir / "core.lease.json").write_text( |
27 | 29 | json.dumps( |
@@ -67,3 +69,22 @@ def test_discover_core_endpoint_rejects_stale_dead_lease(monkeypatch, tmp_path: |
67 | 69 | endpoint = discover_core_endpoint() |
68 | 70 |
|
69 | 71 | assert endpoint is None |
| 72 | + |
| 73 | + |
| 74 | +def test_discover_core_endpoint_rejects_unreachable_tcp_endpoint( |
| 75 | + monkeypatch, tmp_path: Path |
| 76 | +) -> None: |
| 77 | + runtime_dir = tmp_path / "core-runtime" |
| 78 | + _write_runtime_files( |
| 79 | + runtime_dir, |
| 80 | + owner_pid=os.getpid(), |
| 81 | + transport="tcp", |
| 82 | + address="127.0.0.1", |
| 83 | + port=54321, |
| 84 | + ) |
| 85 | + monkeypatch.setenv("KAGAN_CORE_RUNTIME_DIR", str(runtime_dir)) |
| 86 | + monkeypatch.setattr("kagan.core.ipc.discovery._is_tcp_endpoint_reachable", lambda *_: False) |
| 87 | + |
| 88 | + endpoint = discover_core_endpoint() |
| 89 | + |
| 90 | + assert endpoint is None |
0 commit comments