summaryrefslogtreecommitdiff
path: root/tests/test_wrapper_service.py
diff options
context:
space:
mode:
authorxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-10 14:32:00 -0400
committerxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-10 14:32:00 -0400
commit684929fe850b744ef841475f88cf2a3189fbb986 (patch)
treec2241fc8f5d193963497cce901ea71c1fcc00971 /tests/test_wrapper_service.py
parentde74f0d2499159ed1cf8f628a166302146ae1f13 (diff)
downloaddecky-lsfg-vk-684929fe850b744ef841475f88cf2a3189fbb986.tar.gz
decky-lsfg-vk-684929fe850b744ef841475f88cf2a3189fbb986.zip
refactor: make Flatpak support plugin-level
Diffstat (limited to 'tests/test_wrapper_service.py')
-rw-r--r--tests/test_wrapper_service.py145
1 files changed, 31 insertions, 114 deletions
diff --git a/tests/test_wrapper_service.py b/tests/test_wrapper_service.py
index 0632d93..52b2aef 100644
--- a/tests/test_wrapper_service.py
+++ b/tests/test_wrapper_service.py
@@ -1,3 +1,4 @@
+import json
import os
import subprocess
import sys
@@ -27,6 +28,7 @@ class WrapperServiceTests(unittest.TestCase):
self.service.local_bin_dir = self.home / ".local/bin"
self.service.config_dir = self.home / ".config/lsfg-vk"
self.service.sidecar_path = self.service.config_dir / "workarounds.json"
+ self.service.config_file_path = self.service.config_dir / "conf.toml"
self.service.wrapper_path = self.service.local_bin_dir / "lsfg"
def tearDown(self):
@@ -51,6 +53,7 @@ class WrapperServiceTests(unittest.TestCase):
def test_writes_owned_dispatcher_and_validates_shell(self):
response = self.service.set("123", self._state(dxvkFrameRate=60, enableZink=True))
+
self.assertTrue(response["success"])
self.assertEqual(response["wrapper_path"], "~/.lsfg")
self.assertTrue(response["wrapper_owned"])
@@ -58,8 +61,10 @@ class WrapperServiceTests(unittest.TestCase):
self.assertEqual(subprocess.run(["/bin/sh", "-n", str(self.service.wrapper_path)]).returncode, 0)
self.assertIn(self.service.MARKER, self.service.wrapper_path.read_text(encoding="utf-8"))
self.assertEqual(self.service.get("123")["state"], self._state(dxvkFrameRate=60, enableZink=True))
+ document = json.loads(self.service.sidecar_path.read_text(encoding="utf-8"))
+ self.assertNotIn("transport", document["apps"]["123"])
- def test_dispatch_clears_managed_values_preserves_other_environment_and_appends_config(self):
+ def test_dispatch_exports_required_workaround_context_and_clears_disable_flags(self):
self.service.set(
"123",
self._state(dxvkFrameRate=30, disableSteamdeckMode=True, disableVkbasalt=True, enableZink=True),
@@ -72,11 +77,15 @@ class WrapperServiceTests(unittest.TestCase):
"DXVK_FRAME_RATE": "5",
"ENABLE_GAMESCOPE_WSI": "1",
"DISABLE_VKBASALT": "0",
+ "DISABLE_LSFGVK": "1",
+ "DISABLE_LSFG": "1",
"MESA_LOADER_DRIVER_OVERRIDE": "llvmpipe",
"MANGOHUD": "1",
},
)
values = dict(line.split("=", 1) for line in result.stdout.splitlines() if "=" in line)
+ self.assertEqual(values["SteamAppId"], "123")
+ self.assertEqual(values["LSFGVK_CONFIG"], str(self.service.config_file_path))
self.assertEqual(values["ENABLE_GAMESCOPE_WSI"], "0")
self.assertEqual(values["DXVK_HDR"], "0")
self.assertEqual(values["SteamDeck"], "0")
@@ -87,7 +96,8 @@ class WrapperServiceTests(unittest.TestCase):
self.assertEqual(values["DXVK_CONFIG"], "dxgi.syncInterval = 0; dxvk.maxFrameRate = 30")
self.assertEqual(values["MANGOHUD"], "1")
self.assertNotIn("DXVK_FRAME_RATE", values)
- self.assertNotIn("ENABLE_VKBASALT", values)
+ self.assertNotIn("DISABLE_LSFGVK", values)
+ self.assertNotIn("DISABLE_LSFG", values)
def test_appid_fallback_and_unmatched_passthrough(self):
self.service.set("123", self._state(disableGamescopeWsi=False, disableHdr=False))
@@ -100,8 +110,9 @@ class WrapperServiceTests(unittest.TestCase):
check=True,
)
fallback_values = dict(line.split("=", 1) for line in fallback.stdout.splitlines() if "=" in line)
+ self.assertEqual(fallback_values["SteamAppId"], "456")
self.assertEqual(fallback_values["SteamDeck"], "0")
- self.assertEqual(fallback_values["SteamGameId"], "456")
+ self.assertEqual(fallback_values["LSFGVK_CONFIG"], str(self.service.config_file_path))
passthrough = subprocess.run(
[str(self.service.wrapper_path), "/usr/bin/env"],
@@ -114,130 +125,35 @@ class WrapperServiceTests(unittest.TestCase):
self.assertEqual(passthrough_values["KEEP"], "yes")
self.assertEqual(passthrough_values["DXVK_HDR"], "1")
- def test_flatpak_shortcut_receives_env_arguments_and_original_target(self):
- fake_flatpak = self.home / ".local/bin/flatpak"
- fake_flatpak.parent.mkdir(parents=True, exist_ok=True)
- fake_flatpak.write_text(
- "#!/bin/sh\n"
- "printf 'ARG:%s\\n' \"$@\"\n",
- encoding="utf-8",
- )
- fake_flatpak.chmod(0o755)
- self.service.set(
- "123",
- self._state(dxvkFrameRate=20, enableZink=True),
- str(fake_flatpak),
- False,
- {"kind": "flatpak", "flatpakAppId": "com.example.Game"},
- )
- result = self._run(123, "run", "com.example.Game", "--windowed", env={"DXVK_CONFIG": "foo=1"})
- args = result.stdout.splitlines()
- self.assertEqual(args[0], "ARG:run")
- self.assertIn("ARG:--filesystem=" + str(self.service.config_dir) + ":rw", args)
- self.assertIn("ARG:--filesystem=" + str(self.home / ".local/share/Steam/steamapps/common/Lossless Scaling") + ":ro", args)
- self.assertIn("ARG:--env=LSFGVK_CONFIG=" + str(self.service.config_file_path), args)
- self.assertIn("ARG:--env=LSFGVK_FLATPAK=1", args)
- self.assertIn("ARG:--env=SteamAppId=123", args)
- self.assertIn("ARG:--env=ENABLE_GAMESCOPE_WSI=0", args)
- self.assertIn("ARG:--env=DXVK_HDR=0", args)
- self.assertIn("ARG:--env=__GLX_VENDOR_LIBRARY_NAME=mesa", args)
- self.assertIn("ARG:--env=MESA_LOADER_DRIVER_OVERRIDE=zink", args)
- self.assertIn("ARG:--env=GALLIUM_DRIVER=zink", args)
- self.assertIn("ARG:--env=DXVK_CONFIG=foo=1; dxvk.maxFrameRate = 20", args)
- self.assertIn("ARG:com.example.Game", args)
- self.assertIn("ARG:--windowed", args)
-
- def test_flatpak_full_executable_form_is_preserved(self):
- fake_flatpak = self.home / ".local/bin/flatpak"
- fake_flatpak.parent.mkdir(parents=True, exist_ok=True)
- fake_flatpak.write_text(
- "#!/bin/sh\n"
- "printf 'ARG:%s\\n' \"$@\"\n",
- encoding="utf-8",
- )
- fake_flatpak.chmod(0o755)
+ def test_direct_flatpak_state_has_only_original_target_transport(self):
response = self.service.set(
"123",
- self._state(),
- f"{fake_flatpak} run com.example.Game",
- False,
- {"kind": "flatpak", "flatpakAppId": "com.example.Game"},
- )
- self.assertTrue(response["success"])
- result = self._run(123, "--windowed")
- args = result.stdout.splitlines()
- self.assertEqual(args[0], "ARG:run")
- self.assertIn("ARG:com.example.Game", args)
- self.assertIn("ARG:--windowed", args)
-
- def test_host_transport_does_not_store_shortcut_target(self):
- self.service.set(
- "123",
- self._state(),
+ self._state(enableZink=True),
"/usr/bin/flatpak",
False,
- {"kind": "flatpak", "flatpakAppId": "com.example.Game"},
- )
- response = self.service.set(
- "123",
- self._state(),
- "/usr/bin/ignored",
- False,
- {"kind": "host"},
- )
- self.assertTrue(response["success"])
- self.assertIsNone(response["shortcut_exe"])
- self.assertIsNone(self.service.get("123")["shortcut_exe"])
-
- def test_flatpak_transport_rejects_non_run_invocation(self):
- fake_flatpak = self.home / ".local/bin/flatpak"
- fake_flatpak.parent.mkdir(parents=True, exist_ok=True)
- fake_flatpak.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
- fake_flatpak.chmod(0o755)
- response = self.service.set(
- "123",
- self._state(),
- str(fake_flatpak),
- False,
- {"kind": "flatpak", "flatpakAppId": "com.example.Game"},
+ {"kind": "flatpak"},
)
- self.assertTrue(response["success"])
- result = subprocess.run(
- [str(self.service.wrapper_path), "bash", "launch-game.sh"],
- env={"PATH": "/usr/bin:/bin", "SteamAppId": "123"},
- capture_output=True,
- text=True,
- )
- self.assertEqual(result.returncode, 64)
- self.assertIn("direct flatpak run", result.stderr)
- def test_flatpak_transport_rejects_external_app_id_change(self):
- fake_flatpak = self.home / ".local/bin/flatpak"
- fake_flatpak.parent.mkdir(parents=True, exist_ok=True)
- fake_flatpak.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
- fake_flatpak.chmod(0o755)
- response = self.service.set(
- "123",
- self._state(),
- str(fake_flatpak),
- False,
- {"kind": "flatpak", "flatpakAppId": "com.example.Game"},
- )
self.assertTrue(response["success"])
- result = subprocess.run(
- [str(self.service.wrapper_path), "run", "com.other.Game"],
- env={"PATH": "/usr/bin:/bin", "SteamAppId": "123"},
- capture_output=True,
- text=True,
- )
- self.assertEqual(result.returncode, 64)
- self.assertIn("application ID changed externally", result.stderr)
+ self.assertEqual(response["transport"], {"kind": "flatpak"})
+ self.assertEqual(response["shortcut_exe"], "/usr/bin/flatpak")
+ document = json.loads(self.service.sidecar_path.read_text(encoding="utf-8"))
+ self.assertEqual(document["apps"]["123"]["transport"], {"kind": "flatpak"})
+ wrapper = self.service.wrapper_path.read_text(encoding="utf-8")
+ self.assertIn("LSFGVK_FLATPAK=1", wrapper)
+ self.assertIn("SteamAppId=\"$appid\"", wrapper)
+ self.assertIn("export LSFGVK_CONFIG", wrapper)
+ self.assertNotIn("--filesystem=", wrapper)
+ self.assertIn('exec "$shortcut_exe" "$@"', wrapper)
+ self.assertEqual(subprocess.run(["/bin/sh", "-n", str(self.service.wrapper_path)]).returncode, 0)
def test_invalid_state_and_foreign_wrapper_fail_closed(self):
invalid = self.service.set("0", self.service.default_state())
self.assertFalse(invalid["success"])
invalid = self.service.set("123", {**self.service.default_state(), "dxvkFrameRate": 61})
self.assertFalse(invalid["success"])
+ invalid = self.service.set("123", self.service.default_state(), "/tmp/flatpak", False, {"kind": "flatpak"})
+ self.assertFalse(invalid["success"])
self.service.local_bin_dir.mkdir(parents=True, exist_ok=True)
self.service.wrapper_path.write_text("#!/bin/sh\necho foreign\n", encoding="utf-8")
@@ -249,6 +165,7 @@ class WrapperServiceTests(unittest.TestCase):
def test_remove_keeps_a_safe_owned_passthrough_wrapper(self):
self.service.set("123", self.service.default_state())
response = self.service.remove("123")
+
self.assertTrue(response["success"])
self.assertIsNone(self.service.get("123")["state"])
self.assertTrue(self.service.wrapper_path.exists())