Files
DroidDeck/tools/tests/test_session_run_display.py

68 lines
3.1 KiB
Python

import os
import re
import shutil
import subprocess
import tempfile
import unittest
from pathlib import Path
SESSION = Path(__file__).resolve().parents[1] / "linuxfs/overlay/usr/local/bin/droiddeck-session"
def run_case():
return re.search(r"^ run\)\n.*?^ ;;\n", SESSION.read_text(), re.M | re.S).group(0)
def steam_display():
return re.search(r"^ steam\)\n(.*?)^ steam_x64=0\n", SESSION.read_text(), re.M | re.S).group(1)
class SessionRunDisplayTest(unittest.TestCase):
def setUp(self):
self.dir = Path(tempfile.mkdtemp())
self.addCleanup(shutil.rmtree, self.dir, True)
self.target = self.dir / "target.sh"
self.target.write_text("printf '%s\\n' \"${WAYLAND_DISPLAY-unset}\" \"${XDG_SESSION_TYPE-unset}\""
" > \"$1\"\n")
def display(self, **env):
base = {k: v for k, v in os.environ.items()
if k not in ("GAMESCOPE_WAYLAND_DISPLAY", "WAYLAND_DISPLAY", "XDG_SESSION_TYPE",
"BL_LAUNCH_DIR")}
seen = self.dir / "seen"
script = ("program_cores() { :; }\nmode=run\ncase $mode in\n" + run_case() + "esac\n"
+ "echo unreachable\n")
run = subprocess.run(["bash", "-c", script, "droiddeck-session", str(self.target), str(seen)],
env={**base, **env}, capture_output=True, text=True, timeout=30)
self.assertEqual(0, run.returncode, run.stderr)
self.assertNotIn("unreachable", run.stdout)
return seen.read_text().splitlines()
def test_programs_under_gamescope_cannot_reach_a_wayland_server(self):
self.assertEqual(["", "x11"], self.display(GAMESCOPE_WAYLAND_DISPLAY="gamescope-0",
WAYLAND_DISPLAY="gamescope-0", XDG_SESSION_TYPE="wayland"))
def test_without_gamescope_the_display_is_left_alone(self):
self.assertEqual(["wayland-0", "wayland"], self.display(WAYLAND_DISPLAY="wayland-0", XDG_SESSION_TYPE="wayland"))
def steam_env(self, **env):
base = {k: v for k, v in os.environ.items()
if k not in ("GAMESCOPE_WAYLAND_DISPLAY", "WAYLAND_DISPLAY", "XDG_SESSION_TYPE")}
script = steam_display() + ('printf "%s\\n" "${WAYLAND_DISPLAY-unset}" "${XDG_SESSION_TYPE-unset}"'
' "${MOZ_SHM_NO_SEALS-unset}" "${MOZ_DISABLE_CONTENT_SANDBOX-unset}"\n')
run = subprocess.run(["bash", "-c", script], env={**base, **env}, capture_output=True, text=True, timeout=30)
self.assertEqual(0, run.returncode, run.stderr)
return run.stdout.splitlines()
def test_steam_games_under_gamescope_cannot_reach_a_wayland_server(self):
self.assertEqual(["", "x11", "1", "1"], self.steam_env(GAMESCOPE_WAYLAND_DISPLAY="gamescope-0",
WAYLAND_DISPLAY="gamescope-0", XDG_SESSION_TYPE="wayland"))
def test_steam_without_gamescope_keeps_the_display(self):
self.assertEqual(["wayland-0", "wayland", "1", "1"],
self.steam_env(WAYLAND_DISPLAY="wayland-0", XDG_SESSION_TYPE="wayland"))
if __name__ == "__main__":
unittest.main()