strix/tests/test_import_warmup.py

99 lines
3.1 KiB
Python

"""The import warm-up thread must never leave the import system poisoned.
Field failure: the warm-up thread's ``strix.core.runner`` import and the main
thread's ``strix.report`` import both walked the agents SDK graph, and the two
held each other's import locks (report -> dedupe -> agents while runner ->
hooks -> report.state). CPython's deadlock avoidance breaks such a cycle by
failing one import, which strands finished submodules in ``sys.modules`` with
their parent package gone — and the next import of one of those submodules
crashes with "partially initialized module".
"""
from __future__ import annotations
import subprocess
import sys
import textwrap
from strix.llm import warmup
def _run(code: str) -> subprocess.CompletedProcess[str]:
return subprocess.run( # noqa: S603
[sys.executable, "-c", textwrap.dedent(code)],
capture_output=True,
text=True,
check=False,
timeout=300,
)
def test_strix_report_does_not_import_the_agents_graph() -> None:
result = _run(
"""
import sys
import strix.report
agents_modules = [m for m in sys.modules if m == "agents" or m.startswith("agents.")]
assert not agents_modules, agents_modules
assert "strix.report.dedupe" not in sys.modules
"""
)
assert result.returncode == 0, result.stderr
def test_check_duplicate_resolves_lazily() -> None:
result = _run(
"""
import strix.report
from strix.report import check_duplicate
from strix.report.dedupe import check_duplicate as direct
assert strix.report.check_duplicate is direct is check_duplicate
"""
)
assert result.returncode == 0, result.stderr
def test_failed_warm_import_purges_orphaned_submodules() -> None:
result = _run(
"""
import sys
from strix.llm.warmup import _warm
# A package whose import fails after a submodule already completed:
# CPython removes the package but leaves the submodule stranded.
import pathlib
import tempfile
root = pathlib.Path(tempfile.mkdtemp())
pkg = root / "stranded_pkg"
pkg.mkdir()
(pkg / "ok.py").write_text("VALUE = 1")
(pkg / "__init__.py").write_text("from . import ok\\nraise RuntimeError('boom')")
sys.path.insert(0, str(root))
_warm(("stranded_pkg",))
assert "stranded_pkg" not in sys.modules
assert "stranded_pkg.ok" not in sys.modules, "orphan survived the purge"
# And the subtree imports cleanly afterwards up to the real error.
try:
import stranded_pkg # noqa: F401
except RuntimeError:
pass
else:
raise AssertionError("expected the package's own error")
"""
)
assert result.returncode == 0, result.stderr
def test_purge_does_not_touch_preexisting_or_healthy_modules() -> None:
before = frozenset(sys.modules) - {"strix.llm.warmup"}
warmup._purge_orphaned_modules(before)
assert "strix.llm.warmup" in sys.modules # parent chain intact -> kept
assert "strix" in sys.modules