Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
"""Tests for tui_gateway/entry.py sys.path hardening (issues #15989, #51286).
|
||||
|
||||
When the TUI backend is spawned by Node.js, the launch directory may shadow
|
||||
Hermes's own top-level modules (``utils``, ``proxy``, ``ui``). entry.py must
|
||||
neutralize this before any non-stdlib import is resolved, by delegating to the
|
||||
shared ``hermes_bootstrap.harden_import_path`` guard.
|
||||
|
||||
These tests assert the entry point wires up the real guard (rather than
|
||||
re-implementing it inline) and that the guard's behavior covers both the
|
||||
relative-cwd form and the absolute-cwd-path form that was the actual #51286
|
||||
failure.
|
||||
"""
|
||||
|
||||
import ast
|
||||
import pathlib
|
||||
|
||||
import hermes_bootstrap
|
||||
|
||||
|
||||
def _entry_source() -> str:
|
||||
here = pathlib.Path(__file__).resolve()
|
||||
repo_root = here.parent.parent.parent # tests/tui_gateway/ -> repo root
|
||||
return (repo_root / "tui_gateway" / "entry.py").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def test_entry_calls_shared_harden_guard_before_heavy_imports():
|
||||
"""entry.py must call hermes_bootstrap.harden_import_path() before it
|
||||
imports tui_gateway.server (which pulls ``from utils import ...``)."""
|
||||
source = _entry_source()
|
||||
tree = ast.parse(source)
|
||||
|
||||
harden_call_line = None
|
||||
server_import_line = None
|
||||
for node in ast.walk(tree):
|
||||
if (
|
||||
isinstance(node, ast.Call)
|
||||
and isinstance(node.func, ast.Attribute)
|
||||
and node.func.attr == "harden_import_path"
|
||||
):
|
||||
harden_call_line = node.lineno
|
||||
if isinstance(node, ast.ImportFrom) and (node.module or "").startswith(
|
||||
"tui_gateway"
|
||||
):
|
||||
if server_import_line is None:
|
||||
server_import_line = node.lineno
|
||||
|
||||
assert harden_call_line is not None, (
|
||||
"entry.py must call hermes_bootstrap.harden_import_path()"
|
||||
)
|
||||
assert server_import_line is not None, "entry.py must import from tui_gateway"
|
||||
assert harden_call_line < server_import_line, (
|
||||
"harden_import_path() must run before tui_gateway.server is imported"
|
||||
)
|
||||
|
||||
|
||||
def test_guard_handles_absolute_cwd_path():
|
||||
"""The #51286 case: the launch dir is on sys.path as its own absolute
|
||||
path, ahead of the Hermes root. harden_import_path must relocate the
|
||||
Hermes root to the front so ``from utils import ...`` resolves to Hermes."""
|
||||
import sys
|
||||
|
||||
original = sys.path[:]
|
||||
try:
|
||||
sys.path[:] = ["/home/user/tg-ws-proxy", "/opt/hermes", "/usr/lib"]
|
||||
hermes_bootstrap.harden_import_path(src_root="/opt/hermes")
|
||||
assert sys.path[0] == "/opt/hermes"
|
||||
assert sys.path.index("/opt/hermes") < sys.path.index(
|
||||
"/home/user/tg-ws-proxy"
|
||||
)
|
||||
finally:
|
||||
sys.path[:] = original
|
||||
Reference in New Issue
Block a user