108 lines
5.2 KiB
Python
108 lines
5.2 KiB
Python
"""The emitted stamp must preserve build identity and reach the runtime reader."""
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.mark.parametrize("variant,distribution,mechanism,payload,tag", [
|
|
("", None, "self", "bootstrap", None),
|
|
("bootstrap", "docker", "external", "bootstrap", None),
|
|
("bundled", "desktop-app", "electron-updater", "bundled", "v0.18.0"),
|
|
("bundled", "desktop-app", "app-installer", "bundled", "v0.18.0"),
|
|
("bundled", "desktop-app", "microsoft-store", "bundled", "v0.18.0"),
|
|
("bundled", "desktop-app", "external", "bundled", "v0.18.0"),
|
|
("light", "desktop-app", "electron-updater", "light", "v0.18.0"),
|
|
("runtime", "apt-termux", "external", "runtime", "v0.18.0"),
|
|
])
|
|
def test_cli_stamp_roundtrip(tmp_path, monkeypatch, variant, distribution, mechanism, payload, tag):
|
|
out = tmp_path / "install-stamp.json"
|
|
script = Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"
|
|
env = {**os.environ, "HERMES_DESKTOP_VARIANT": variant, "HERMES_PAYLOAD_TAG": "v0.18.0", "HERMES_BUILD_COMMIT": ""}
|
|
args = [sys.executable, str(script), "--output", str(out), "--commit", "d" * 40,
|
|
"--source", "ci", "--base-version", "0.18.0", "--distance", "0",
|
|
"--update-mechanism", mechanism]
|
|
if distribution:
|
|
args += ["--distribution", distribution]
|
|
result = subprocess.run(args, env=env, capture_output=True, text=True, timeout=30, check=False)
|
|
assert result.returncode == 0, result.stderr
|
|
data = json.loads(out.read_text(encoding="utf-8-sig"))
|
|
assert {key: data[key] for key in ("source", "distribution", "updateMechanism", "payload", "tag", "commit")} == {
|
|
"source": "ci", "distribution": distribution, "updateMechanism": mechanism,
|
|
"payload": payload, "tag": tag, "commit": "d" * 40}
|
|
assert data["baseVersion"] == data["displayVersion"] == "0.18.0"
|
|
from hermes_cli.version_info import _stamp_version_info
|
|
from hermes_cli.venv_sync import _is_sealed
|
|
monkeypatch.setenv("HERMES_INSTALL_ROOT", str(tmp_path))
|
|
if payload == "light":
|
|
with pytest.raises(RuntimeError, match="light"):
|
|
_stamp_version_info()
|
|
else:
|
|
info = _stamp_version_info()
|
|
assert info is not None and info.commit == "d" * 40
|
|
assert _is_sealed(tmp_path)
|
|
(tmp_path / ".git").mkdir()
|
|
assert not _is_sealed(tmp_path), "a stamped source checkout is not sealed"
|
|
|
|
|
|
@pytest.mark.parametrize("arguments", [[], ["--update-mechanism", "carrier-pigeon"]])
|
|
def test_missing_or_invalid_mechanism_cannot_emit_stamp(tmp_path, arguments):
|
|
from scripts.write_install_stamp import build_stamp
|
|
|
|
out = tmp_path / "install-stamp.json"
|
|
result = subprocess.run(
|
|
[sys.executable, str(Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"),
|
|
"--output", str(out), "--commit", "a" * 40, *arguments],
|
|
capture_output=True, text=True, timeout=30,
|
|
check=False,
|
|
)
|
|
assert result.returncode != 0 and "--update-mechanism" in result.stderr
|
|
assert not out.exists()
|
|
with pytest.raises(SystemExit, match="invalid --update-mechanism"):
|
|
build_stamp(commit="a" * 40, update_mechanism=arguments[-1] if arguments else "")
|
|
|
|
|
|
@pytest.mark.parametrize("variant,tag,error", [
|
|
("bundled", "", "HERMES_PAYLOAD_TAG"), ("light", "", "HERMES_PAYLOAD_TAG"),
|
|
("chonky", "v0.18.0", "unknown HERMES_DESKTOP_VARIANT"),
|
|
])
|
|
def test_invalid_variant_cannot_emit_stamp(tmp_path, variant, tag, error):
|
|
out = tmp_path / "install-stamp.json"
|
|
result = subprocess.run(
|
|
[sys.executable, str(Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"),
|
|
"--output", str(out), "--commit", "d" * 40, "--base-version", "0.18.0",
|
|
"--update-mechanism", "self"],
|
|
env={**os.environ, "HERMES_DESKTOP_VARIANT": variant, "HERMES_PAYLOAD_TAG": tag, "HERMES_BUILD_COMMIT": ""},
|
|
capture_output=True, text=True, timeout=30, check=False)
|
|
assert result.returncode != 0 and error in result.stderr
|
|
assert not out.exists()
|
|
|
|
|
|
def test_packaged_identity_never_falls_back_to_project_metadata(tmp_path, monkeypatch):
|
|
from scripts import write_install_stamp
|
|
from hermes_cli.version_info import _stamp_version_info
|
|
|
|
(tmp_path / "hermes_cli").mkdir()
|
|
(tmp_path / "hermes_cli" / "_version.py").write_text('__version__ = "9.9.9"\n', encoding="utf-8")
|
|
(tmp_path / "pyproject.toml").write_text('[project]\nversion = "8.8.8"\n', encoding="utf-8")
|
|
monkeypatch.setattr(write_install_stamp, "_REPO_ROOT", tmp_path)
|
|
monkeypatch.setenv("HERMES_INSTALL_ROOT", str(tmp_path))
|
|
|
|
# No reachable release (a tagless docker build): the admitted commit is the whole identity.
|
|
write_install_stamp.write_stamp(
|
|
tmp_path / "install-stamp.json", update_mechanism="external", commit="d" * 40, source="ci", dirty=False,
|
|
)
|
|
info = _stamp_version_info()
|
|
assert info is not None
|
|
assert (info.base_version, info.derived_version, info.commit) == ("unknown", "git.ddddddd", "d" * 40)
|
|
|
|
stamp = write_install_stamp.build_stamp(
|
|
update_mechanism="external", commit="d" * 40, source="ci",
|
|
base_version="1.2.3", distance=0,
|
|
)
|
|
|
|
assert stamp["baseVersion"] == stamp["displayVersion"] == "1.2.3"
|