Files
hermes-agent/tests/scripts/install/test_dmg_install_driver.py

81 lines
3.1 KiB
Python

"""The DMG driver must wait for native bootstrap completion, not install.sh's marker."""
import os
from pathlib import Path
import shutil
import subprocess
import pytest
DRIVER = Path(__file__).resolve().parents[2] / "install/e2e-assets/drive-dmg-install.sh"
@pytest.mark.platforms("posix")
@pytest.mark.parametrize("missing,expected", [
("", True),
("legacy", True),
("checkout", False),
("launcher", False),
("app", False),
("completion", False),
("historical", True),
("marker-only", False),
("wrong-root-log", False),
])
def test_dmg_driver_requires_complete_pm_source_install(tmp_path, missing, expected):
root = tmp_path / "installed source"
root.mkdir()
if missing != "legacy":
(root / "pm").mkdir(parents=True)
(root / "pm/lock.json").write_text("{}", encoding="utf-8")
if missing != "checkout":
(root / ".git").mkdir()
launcher = root / ".hermes/bin/hermes"
if missing not in {"launcher", "legacy"}:
launcher.parent.mkdir(parents=True)
launcher.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
launcher.chmod(0o755)
if missing != "app":
(root / "apps/desktop/release/mac-arm64/Hermes.app").mkdir(parents=True)
if missing not in {"completion", "historical", "wrong-root-log"}:
(root / ".hermes-bootstrap-complete").write_text("completed", encoding="utf-8")
# The legacy file must not mask a missing PM publication.
legacy = root / "venv/bin/hermes"
legacy.parent.mkdir(parents=True)
legacy.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
legacy.chmod(0o755)
mocks = tmp_path / "mock-bin"
mocks.mkdir()
for name, script in {
"osascript": "#!/bin/sh\nprintf 'no-window\\n'\n",
"cliclick": "#!/bin/sh\nexit 0\n",
"screencapture": "#!/bin/sh\nexit 0\n",
"sleep": f"#!/bin/sh\n{shutil.which('sleep')} 0.05\n",
}.items():
command = mocks / name
command.write_text(script, encoding="utf-8")
command.chmod(0o755)
app_bin = tmp_path / "Hermes-Setup"
app_bin.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
app_bin.chmod(0o755)
home = tmp_path / "home"
home.mkdir()
if missing not in {"completion", "marker-only"}:
logs = home / ".hermes/logs"
logs.mkdir(parents=True)
logged_root = tmp_path / "other-install" if missing == "wrong-root-log" else root
(logs / "bootstrap-installer.log").write_text(
f"INFO hermes_bootstrap_lib::bootstrap: bootstrap complete install_root={logged_root}\n",
encoding="utf-8",
)
result = subprocess.run(
["bash", str(DRIVER), "--app-bin", str(app_bin), "--install-dir", str(root),
"--install-timeout-secs", "2", "--proof-dir", str(tmp_path / "proof")],
env=dict(os.environ, HOME=str(home), PATH=f"{mocks}:{os.environ['PATH']}"),
capture_output=True, text=True, timeout=15,
)
assert (result.returncode == 0) is expected, result.stdout + result.stderr
assert ("install landed:" in result.stdout) is expected, result.stdout