mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 11:01:07 +00:00
68 lines
3.1 KiB
Python
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()
|