left4me/l4d2host/tests
mwiegand dd918aca4b
fix(left4me-overlay): use /proc/self/mountinfo to detect bind mounts
os.path.ismount() compares st_dev against the parent dir, which silently
returns False for same-fs bind mounts. The idmap binds at runtime/<n>/
idmap/<basename> are exactly that case, so:

- cmd_umount skipped the bind-umount step every stop, leaving orphan
  binds in PID 1's mount namespace.
- cmd_mount's idempotency check then "didn't see" the orphan and
  re-bound on top, accumulating one mount per start/stop cycle.

Findmnt nesting like
    /var/lib/left4me/runtime/2/idmap/overlays_9
    └─/var/lib/left4me/runtime/2/idmap/overlays_9
is the visible symptom. Reboot wipes everything so the bug is invisible
on a fresh boot — only stop/start cycles accumulate.

Replace both ismount sites with a _is_mountpoint() helper that reads
/proc/self/mountinfo (column 5 is the mount point). Keep os.path.ismount
for the overlay merged check, where it's reliable (distinct fs type).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 01:02:18 +02:00
..
test_cli.py l4d2host: LEFT4ME_STEAMCMD env var for steamcmd path 2026-05-10 22:46:21 +02:00
test_initialize.py feat(l4d2-web): per-overlay server.cfg aliases — expose checkbox + auto-exec 2026-05-09 01:26:31 +02:00
test_install.py fix(host): create ~/.steam/sdk32 and sdk64 symlinks during install 2026-05-07 02:11:27 +02:00
test_lifecycle.py refactor(l4d2-host): unmount via ExecStopPost — single code path mirroring mount 2026-05-09 13:09:52 +02:00
test_logging.py feat(host): add step logging to steam_install 2026-05-06 20:41:39 +02:00
test_logs.py feat(deploy): add production-like test deployment 2026-05-06 19:30:10 +02:00
test_overlay_helper.py fix(left4me-overlay): use /proc/self/mountinfo to detect bind mounts 2026-05-15 01:02:18 +02:00
test_paths.py security: harden boundary inputs and production defaults 2026-05-07 00:53:33 +02:00
test_process.py fix(host): enforce flush=True to prevent pipeline block buffering 2026-05-06 20:34:41 +02:00
test_service_control.py feat(l4d2-host): server lifecycle uses systemctl enable --now / disable --now 2026-05-09 12:28:44 +02:00
test_spec.py feat(l4d2-web): per-overlay server.cfg aliases — expose checkbox + auto-exec 2026-05-09 01:26:31 +02:00
test_status.py feat(deploy): add production-like test deployment 2026-05-06 19:30:10 +02:00