Files
ink-releases/test/installer_e2e.py
T
2026-08-10 23:31:23 +02:00

81 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python3
# req: installer/001, installer/002, installer/003, installer/004, installer/006 test
import hashlib
import http.server
import os
from pathlib import Path
import socketserver
import subprocess
import tempfile
import threading
ROOT = Path(__file__).resolve().parents[1]
TARGET = "x86_64-linux-musl"
def sha(path: Path) -> str:
return hashlib.sha256(path.read_bytes()).hexdigest()
with tempfile.TemporaryDirectory() as raw:
tmp = Path(raw)
server_root = tmp / "server"
ink_release = server_root / "releases" / "v-test" / "ink"
tools_release = server_root / "releases" / "v-tools" / "toolset"
ink_release.mkdir(parents=True)
tools_release.mkdir(parents=True)
ink_asset = ink_release / f"ink-{TARGET}"
ink_asset.write_text("#!/bin/sh\necho ink\n")
os.chmod(ink_asset, 0o755)
(ink_release / "ink-SHA256SUMS").write_text(f"{sha(ink_asset)} {ink_asset.name}\n")
rows = []
for name, group in (("facts", "text"), ("lines", "text"), ("httpget", "web"), ("gitstatus", "git")):
asset = tools_release / f"{name}-{TARGET}"
asset.write_text(f"#!/bin/sh\necho {name}\n")
os.chmod(asset, 0o755)
rows.append(("tmk241/ink-toolset", "fixture-commit", name, group, TARGET, asset.stat().st_size, sha(asset), asset.name))
manifest_name = f"ink-toolset-v-tools-{TARGET}.manifest.tsv"
manifest = tools_release / manifest_name
manifest.write_text("source_repository\tsource_commit\texecutable\tset\ttarget\tbytes\tsha256\tasset\n" + "".join("\t".join(map(str, row)) + "\n" for row in rows))
sums = [f"{sha(tools_release / row[7])} {row[7]}\n" for row in rows]
sums.append(f"{sha(manifest)} {manifest.name}\n")
(tools_release / "ink-toolset-SHA256SUMS").write_text("".join(sums))
class Quiet(http.server.SimpleHTTPRequestHandler):
def log_message(self, *_args):
pass
handler = lambda *args, **kwargs: Quiet(*args, directory=server_root, **kwargs)
with socketserver.TCPServer(("127.0.0.1", 0), handler) as server:
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
port = server.server_address[1]
prefix = tmp / "prefix"
home = tmp / "home"
home.mkdir()
policy = home / "policy.tsv"
policy.write_text("sentinel\n")
env = {
**os.environ,
"HOME": str(home),
"INK_RELEASE_BASE": f"http://127.0.0.1:{port}",
}
result = subprocess.run(
["/bin/sh", str(ROOT / "install.sh"), "--ink-version", "v-test", "--toolset-version", "v-tools", "--set", "text", "--tool", "httpget", "--prefix", str(prefix), "--yes"],
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
server.shutdown()
assert result.returncode == 0, result.stderr
assert sorted(path.name for path in (prefix / "bin").iterdir()) == ["facts", "httpget", "ink", "lines"]
assert subprocess.check_output([prefix / "bin" / "ink"], text=True).strip() == "ink"
assert not (prefix / "bin" / "gitstatus").exists()
assert policy.read_text() == "sentinel\n"
assert not (home / ".profile").exists()