Add pre-merge native stability checks (#21)
* Add pre-merge native stability checks * Install native binding generator dependencies explicitly * Pin portal contract fixtures for reproducible CI
This commit is contained in:
1 parent
b356f63b93
commit
216ef38972
6 files changed
+338
-11
No files matched your search
@@ -0,0 +1,66 @@
|
||||
"""Run native regressions against a private, headless Weston instance."""
|
||||
import argparse
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--log-dir", type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
logs = args.log_dir.resolve()
|
||||
logs.mkdir(parents=True, exist_ok=True)
|
||||
repo = Path(__file__).resolve().parents[2]
|
||||
|
||||
# No inherited session endpoints or activation settings reach the test host.
|
||||
env = {key: value for key, value in os.environ.items()
|
||||
if not key.startswith("FERESE_") or key.startswith("FERESE_TEST_")}
|
||||
for key in ("DISPLAY", "WAYLAND_DISPLAY", "WAYLAND_SOCKET", "XAUTHORITY",
|
||||
"DBUS_SESSION_BUS_ADDRESS", "DBUS_SESSION_BUS_PID", "EGL_PLATFORM"):
|
||||
env.pop(key, None)
|
||||
env.update(LIBGL_ALWAYS_SOFTWARE="1", FERESE_TEST_LOG_DIR=str(logs))
|
||||
|
||||
with tempfile.TemporaryDirectory(prefix="ferese-native-host-") as temporary:
|
||||
root = Path(temporary)
|
||||
runtime = root / "runtime"
|
||||
runtime.mkdir(mode=0o700)
|
||||
env.update(XDG_RUNTIME_DIR=str(runtime), WAYLAND_DISPLAY="ferese-test-host",
|
||||
XDG_CONFIG_HOME=str(root / "config"), XDG_STATE_HOME=str(root / "state"),
|
||||
XDG_CACHE_HOME=str(root / "cache"))
|
||||
with (logs / "weston.log").open("w") as log:
|
||||
host = subprocess.Popen([
|
||||
env.get("FERESE_TEST_WESTON", "weston"), "--backend=headless-backend.so",
|
||||
"--renderer=pixman", "--width=1600", "--height=1000",
|
||||
"--socket=ferese-test-host", "--idle-time=0", "--no-config",
|
||||
], env=env, stdout=log, stderr=log, start_new_session=True)
|
||||
try:
|
||||
deadline = time.monotonic() + 15
|
||||
while not (runtime / env["WAYLAND_DISPLAY"]).is_socket():
|
||||
if host.poll() is not None or time.monotonic() >= deadline:
|
||||
raise RuntimeError((logs / "weston.log").read_text())
|
||||
time.sleep(.05)
|
||||
for layout in ("continuous", "islands"):
|
||||
subprocess.run([
|
||||
sys.executable, "scripts/tests/test_shell_motion_isolated.py", "-v",
|
||||
], cwd=repo, env=dict(env, FERESE_TEST_SHELL_MOTION="1",
|
||||
FERESE_TEST_BAR_LAYOUT=layout), check=True)
|
||||
subprocess.run([
|
||||
sys.executable, "scripts/tests/test_xwayland_isolated.py", "-v",
|
||||
], cwd=repo, env=dict(env, FERESE_TEST_XWAYLAND="1"), check=True)
|
||||
finally:
|
||||
if host.poll() is None:
|
||||
os.killpg(host.pid, signal.SIGTERM)
|
||||
try:
|
||||
host.wait(timeout=5)
|
||||
except subprocess.TimeoutExpired:
|
||||
os.killpg(host.pid, signal.SIGKILL)
|
||||
host.wait(timeout=5)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user