summaryrefslogtreecommitdiff
path: root/tests/test_flatpak_service.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_flatpak_service.py')
-rw-r--r--tests/test_flatpak_service.py174
1 files changed, 94 insertions, 80 deletions
diff --git a/tests/test_flatpak_service.py b/tests/test_flatpak_service.py
index 70ba228..d5baf61 100644
--- a/tests/test_flatpak_service.py
+++ b/tests/test_flatpak_service.py
@@ -26,7 +26,12 @@ class FlatpakServiceTests(unittest.TestCase):
self.service.config_dir = self.home / ".config/lsfg-vk"
self.service.config_file_path = self.service.config_dir / "conf.toml"
self.service.check_flatpak_available = Mock(return_value=True)
- self.service._run_flatpak_command = Mock()
+ self.service._run_flatpak_command = Mock(side_effect=self._run_flatpak_command)
+ self.runtime_ref = "org.freedesktop.Platform/x86_64/24.08"
+ self.runtime_metadata = ""
+ self.user_branches = set()
+ self.system_branches = set()
+ self.install_branch = "24.08"
self.bundle = self.home / "lsfg-vk-24.08.flatpak"
self.bundle.write_bytes(b"bundle")
self.service._bundled_extension_path = Mock(return_value=self.bundle)
@@ -42,6 +47,22 @@ class FlatpakServiceTests(unittest.TestCase):
def _extension_line(branch):
return f"org.freedesktop.Platform.VulkanLayer.lsfgvk\tx86_64\t{branch}\n"
+ def _run_flatpak_command(self, args, **_kwargs):
+ if args[0] == "info" and args[1] == "--show-runtime":
+ return self._result(self.runtime_ref + "\n")
+ if args[0] == "info" and args[1] == "--show-metadata":
+ return self._result(self.runtime_metadata)
+ if args[0] == "list":
+ branches = self.user_branches if "--user" in args else self.system_branches
+ return self._result("".join(self._extension_line(branch) for branch in sorted(branches)))
+ if args[0] == "install":
+ self.user_branches.add(self.install_branch)
+ return self._result()
+ if args[0] == "uninstall":
+ self.user_branches.discard(args[-1].rsplit("/", 1)[-1])
+ return self._result()
+ raise AssertionError(f"Unexpected Flatpak command: {args}")
+
def test_runtime_branch_mapping_is_strict_and_branch_specific(self):
self.assertEqual(
FlatpakService.runtime_branch_from_ref(
@@ -62,11 +83,20 @@ class FlatpakServiceTests(unittest.TestCase):
"org.freedesktop.Platform/x86_64/26.08"
)
+ def test_runtime_branch_mapping_reads_documented_gl_metadata(self):
+ metadata = """
+[Extension org.freedesktop.Platform.GL]
+versions=25.08;25.08-extra;1.4
+version=1.4
+"""
+ self.assertEqual(FlatpakService.runtime_branch_from_metadata(metadata), "25.08")
+ with self.assertRaises(ValueError):
+ FlatpakService.runtime_branch_from_metadata(
+ "[Extension org.freedesktop.Platform.GL]\nversions=26.08;26.08-extra;1.4\n"
+ )
+
def test_resolve_reads_required_runtime_instead_of_any_installed_branch(self):
- self.service._run_flatpak_command.side_effect = [
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(self._extension_line("23.08")),
- ]
+ self.user_branches = {"23.08"}
response = self.service.resolve_app_support("com.example.Game")
@@ -80,22 +110,48 @@ class FlatpakServiceTests(unittest.TestCase):
)
self.assertEqual(
self.service._run_flatpak_command.call_args_list[1].args[0],
- ["list", "--runtime", "--columns=application,arch,branch"],
+ ["list", "--user", "--runtime", "--columns=application,arch,branch"],
+ )
+ self.assertEqual(
+ self.service._run_flatpak_command.call_args_list[2].args[0],
+ ["list", "--system", "--runtime", "--columns=application,arch,branch"],
)
- def test_install_records_only_a_new_user_owned_branch(self):
- self.service._run_flatpak_command.side_effect = [
- self._result(""),
- self._result(""),
- self._result(self._extension_line("24.08")),
- ]
+ def test_resolve_maps_kde_and_gnome_runtimes_from_gl_metadata(self):
+ metadata = "[Extension org.freedesktop.Platform.GL]\nversions=25.08;25.08-extra;1.4\n"
+ for runtime in ("org.kde.Platform/x86_64/6.10", "org.gnome.Platform/x86_64/49"):
+ with self.subTest(runtime=runtime):
+ self.service._run_flatpak_command.reset_mock()
+ self.runtime_ref = runtime
+ self.runtime_metadata = metadata
+ response = self.service.resolve_app_support("com.example.Game")
+ self.assertEqual(response["runtime_branch"], "25.08")
+ self.assertEqual(response["support_status"], "needs-runtime")
+ self.assertEqual(
+ self.service._run_flatpak_command.call_args_list[1].args[0],
+ ["info", "--show-metadata", runtime],
+ )
+
+ def test_system_extension_is_ready_without_installing_a_user_copy(self):
+ self.system_branches = {"24.08"}
+
+ response = self.service.ensure_app_support("com.example.Game")
+
+ self.assertTrue(response["success"])
+ self.assertEqual(response["support_status"], "ready")
+ self.assertEqual(
+ [call.args[0][0] for call in self.service._run_flatpak_command.call_args_list],
+ ["info", "list", "list"],
+ )
+ self.assertFalse(any(call.args[0][0] == "install" for call in self.service._run_flatpak_command.call_args_list))
+ def test_install_records_only_a_new_user_owned_branch(self):
response = self.service.install_extension("24.08")
self.assertTrue(response["success"])
self.assertTrue(response["enabled"])
self.assertTrue(response["installed"])
- install_args = self.service._run_flatpak_command.call_args_list[1].args[0]
+ install_args = self.service._run_flatpak_command.call_args_list[2].args[0]
self.assertEqual(install_args[:4], ["install", "--user", "--noninteractive", "--or-update"])
self.assertEqual(
json.loads(self.service.ownership_path.read_text(encoding="utf-8")),
@@ -103,9 +159,7 @@ class FlatpakServiceTests(unittest.TestCase):
)
def test_preexisting_branch_is_not_claimed_or_removed(self):
- self.service._run_flatpak_command.return_value = self._result(
- self._extension_line("24.08")
- )
+ self.user_branches = {"24.08"}
install_response = self.service.install_extension("24.08")
cleanup_response = self.service.remove_plugin_owned_extensions()
@@ -115,15 +169,10 @@ class FlatpakServiceTests(unittest.TestCase):
self.assertTrue(install_response["installed"])
self.assertFalse(self.service.ownership_path.exists())
self.assertTrue(cleanup_response["success"])
- self.assertEqual(self.service._run_flatpak_command.call_count, 1)
-
- def test_extension_toggle_installs_and_uninstalls_preexisting_branch(self):
- self.service._run_flatpak_command.side_effect = [
- self._result(self._extension_line("24.08")),
- self._result(self._extension_line("24.08")),
- self._result(""),
- self._result(""),
- ]
+ self.assertEqual(self.service._run_flatpak_command.call_count, 2)
+
+ def test_extension_toggle_preserves_preexisting_branch(self):
+ self.user_branches = {"24.08"}
enable_response = self.service.set_extension_enabled("24.08", True)
disable_response = self.service.set_extension_enabled("24.08", False)
@@ -132,36 +181,36 @@ class FlatpakServiceTests(unittest.TestCase):
self.assertTrue(enable_response["enabled"])
self.assertTrue(enable_response["installed"])
self.assertTrue(disable_response["success"])
- self.assertFalse(disable_response["enabled"])
- self.assertFalse(disable_response["installed"])
- self.assertTrue(disable_response["removed"])
+ self.assertTrue(disable_response["enabled"])
+ self.assertTrue(disable_response["installed"])
+ self.assertFalse(disable_response["removed"])
+ self.assertEqual(self.user_branches, {"24.08"})
self.assertEqual(
[call.args[0][0] for call in self.service._run_flatpak_command.call_args_list],
- ["list", "list", "uninstall", "list"],
+ ["list", "list", "list", "list"],
)
- def test_extension_toggle_removes_owned_branch_and_can_repeat_disable(self):
+ def test_extension_toggle_removes_owned_user_branch_but_preserves_system_branch(self):
self.service.ownership_path.parent.mkdir(parents=True, exist_ok=True)
self.service.ownership_path.write_text(
json.dumps({"version": 1, "plugin_owned_branches": ["24.08"]}),
encoding="utf-8",
)
- self.service._run_flatpak_command.side_effect = [
- self._result(self._extension_line("24.08")),
- self._result(""),
- self._result(""),
- self._result(""),
- ]
+ self.user_branches = {"24.08"}
+ self.system_branches = {"24.08"}
disable_response = self.service.set_extension_enabled("24.08", False)
repeat_response = self.service.set_extension_enabled("24.08", False)
self.assertTrue(disable_response["success"])
- self.assertFalse(disable_response["enabled"])
+ self.assertTrue(disable_response["enabled"])
self.assertTrue(disable_response["removed"])
self.assertTrue(repeat_response["success"])
- self.assertFalse(repeat_response["enabled"])
- self.assertFalse(repeat_response["installed"])
+ self.assertTrue(repeat_response["enabled"])
+ self.assertTrue(repeat_response["installed"])
+ self.assertEqual(self.user_branches, set())
+ self.assertEqual(self.system_branches, {"24.08"})
+ self.assertFalse(self.service.ownership_path.exists())
uninstall_commands = [
call.args[0]
for call in self.service._run_flatpak_command.call_args_list
@@ -190,23 +239,16 @@ class FlatpakServiceTests(unittest.TestCase):
self.assertEqual(self.service._run_flatpak_command.call_count, 0)
def test_ensure_app_support_installs_only_the_app_runtime_branch(self):
- self.service._run_flatpak_command.side_effect = [
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(""),
- self._result(""),
- self._result(""),
- self._result(""),
- self._result(self._extension_line("24.08")),
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(self._extension_line("24.08")),
- ]
-
response = self.service.ensure_app_support("com.example.Game")
self.assertTrue(response["success"])
self.assertEqual(response["support_status"], "ready")
self.assertEqual(response["runtime_branch"], "24.08")
- install_args = self.service._run_flatpak_command.call_args_list[4].args[0]
+ install_args = next(
+ call.args[0]
+ for call in self.service._run_flatpak_command.call_args_list
+ if call.args[0][0] == "install"
+ )
self.assertEqual(install_args[0], "install")
self.assertIn("--user", install_args)
self.assertNotIn("23.08", install_args)
@@ -216,19 +258,6 @@ class FlatpakServiceTests(unittest.TestCase):
)
def test_two_shortcuts_using_one_flatpak_share_one_extension_branch(self):
- self.service._run_flatpak_command.side_effect = [
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(""),
- self._result(""),
- self._result(""),
- self._result(""),
- self._result(self._extension_line("24.08")),
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(self._extension_line("24.08")),
- self._result("org.freedesktop.Platform/x86_64/24.08\n"),
- self._result(self._extension_line("24.08")),
- ]
-
first = self.service.ensure_app_support("net.pcsx2.PCSX2")
second = self.service.ensure_app_support("net.pcsx2.PCSX2.Dev")
@@ -251,22 +280,7 @@ class FlatpakServiceTests(unittest.TestCase):
json.dumps({"version": 1, "plugin_owned_branches": ["23.08", "24.08"]}),
encoding="utf-8",
)
- self.service._run_flatpak_command.side_effect = [
- self._result(
- "\n".join(
- [
- "\t".join([FlatpakService.EXTENSION_ID, "x86_64", "23.08"]),
- "\t".join([FlatpakService.EXTENSION_ID, "x86_64", "24.08"]),
- ]
- )
- + "\n"
- ),
- self._result(""),
- self._result("\t".join([FlatpakService.EXTENSION_ID, "x86_64", "24.08"]) + "\n"),
- self._result("\t".join([FlatpakService.EXTENSION_ID, "x86_64", "24.08"]) + "\n"),
- self._result(""),
- self._result(""),
- ]
+ self.user_branches = {"23.08", "24.08"}
response = self.service.remove_plugin_owned_extensions()