import os
import shutil
import subprocess
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parent.parent
FIXTURES = Path(__file__).resolve().parent / "fixtures"
AIRGAP_BIN = REPO_ROOT / "target" / "debug" / "airgap"
@pytest.fixture(scope="session")
def airgap_bin():
return AIRGAP_BIN
@pytest.fixture(scope="session")
def airgap_ready(airgap_bin, tmp_path_factory):
probe = tmp_path_factory.mktemp("airgap_probe")
marker = "__airgap_ready__"
proc = subprocess.run(
[
str(airgap_bin),
"--allow-unknown-program",
shutil.which("echo") or "/bin/echo",
marker,
],
cwd=probe,
capture_output=True,
text=True,
)
if proc.returncode != 0 or marker not in proc.stdout:
pytest.skip(
"airgap is not runnable — it needs CAP_SYS_ADMIN and a working build.\n"
f" grant it: sudo setcap cap_sys_admin+ep {airgap_bin}\n"
f" exit={proc.returncode} stderr={proc.stderr.strip()!r}"
)
return airgap_bin
@pytest.fixture
def workdir(tmp_path):
for src in FIXTURES.iterdir():
if src.is_file():
shutil.copy(src, tmp_path / src.name)
return tmp_path
@pytest.fixture
def airgap(airgap_ready, workdir):
def _run(*args, **kwargs):
flags = kwargs.pop("airgap_flags", ["--allow-unknown-program"])
env = {**os.environ, "HOME": str(workdir), **kwargs.pop("env", {})}
return subprocess.run(
[str(airgap_ready), *flags, *args],
cwd=workdir,
capture_output=True,
text=True,
env=env,
**kwargs,
)
_run.workdir = workdir
return _run