mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 02:51:10 +00:00
89 lines
3.9 KiB
Python
89 lines
3.9 KiB
Python
import os
|
|
from pathlib import Path
|
|
import shlex
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
|
|
|
|
SCRIPT = Path(__file__).resolve().parents[1] / "linuxfs/overlay/usr/local/bin/droiddeck-emulators"
|
|
|
|
|
|
class EmulatorsInstallTest(unittest.TestCase):
|
|
def run_install(self, failure=""):
|
|
with tempfile.TemporaryDirectory(prefix="emulator install 'quoted' ") as directory:
|
|
root = Path(directory)
|
|
bin_dir = root / "bin"
|
|
bin_dir.mkdir()
|
|
calls = root / "calls"
|
|
launcher = root / "PPSSPPSDL"
|
|
helper = root / "droiddeck-flatpak"
|
|
helper.write_text(
|
|
"import os, sys\n"
|
|
"with open(os.environ['CALLS'], 'a') as f:\n"
|
|
" f.write('helper ' + ' '.join(sys.argv[1:]) + '\\n')\n"
|
|
"sys.exit(1 if os.environ['FAILURE'] == 'helper' else 0)\n"
|
|
)
|
|
stubs = {
|
|
"droiddeck-root":
|
|
'echo "apt $*" >> "$CALLS"\n'
|
|
'[ "$FAILURE" != "apt-$2" ]',
|
|
"flatpak":
|
|
'echo "flatpak $*" >> "$CALLS"\n'
|
|
'if [ "$1" = install ]; then\n'
|
|
' echo "Could not connect: No such file or directory" >&2\n'
|
|
' exit 1\n'
|
|
'fi\n'
|
|
'[ "$FAILURE" != remote ]',
|
|
}
|
|
for name, body in stubs.items():
|
|
path = bin_dir / name
|
|
path.write_text("#!/bin/sh\n" + body + "\n")
|
|
path.chmod(0o755)
|
|
script = root / "install"
|
|
script.write_text(SCRIPT.read_text()
|
|
.replace("/usr/local/bin/droiddeck-flatpak install", shlex.quote(str(helper)) + " install")
|
|
.replace("/usr/local/bin/PPSSPPSDL", shlex.quote(str(launcher))))
|
|
env = dict(os.environ, PATH=str(bin_dir) + os.pathsep + os.environ["PATH"],
|
|
CALLS=str(calls), FAILURE=failure)
|
|
result = subprocess.run(["bash", str(script), "install"], env=env,
|
|
capture_output=True, text=True, timeout=30)
|
|
return result, calls.read_text(), launcher.read_text() if launcher.exists() else None, \
|
|
os.access(launcher, os.X_OK)
|
|
|
|
def test_install_without_a_system_bus_uses_the_helper_and_creates_the_launcher(self):
|
|
result, calls, launcher, executable = self.run_install()
|
|
self.assertEqual(0, result.returncode, result.stdout + result.stderr)
|
|
self.assertIn("helper install org.ppsspp.PPSSPP\n", calls)
|
|
self.assertNotIn("flatpak install ", calls)
|
|
self.assertIn('exec /usr/local/bin/droiddeck-flatpak-run org.ppsspp.PPSSPP "$@"', launcher)
|
|
self.assertTrue(executable)
|
|
|
|
def test_helper_failure_does_not_publish_a_launcher(self):
|
|
result, calls, launcher, _ = self.run_install("helper")
|
|
self.assertNotEqual(0, result.returncode)
|
|
self.assertIn("helper install org.ppsspp.PPSSPP\n", calls)
|
|
self.assertIn("== FAIL org.ppsspp.PPSSPP", result.stdout)
|
|
self.assertIsNone(launcher)
|
|
|
|
def test_apt_failure_stops_before_flatpak(self):
|
|
for stage in ("update", "install"):
|
|
with self.subTest(stage=stage):
|
|
result, calls, launcher, _ = self.run_install("apt-" + stage)
|
|
self.assertNotEqual(0, result.returncode)
|
|
self.assertIn("== FAIL apt-get " + stage, result.stdout)
|
|
self.assertNotIn("flatpak ", calls)
|
|
self.assertNotIn("helper ", calls)
|
|
self.assertIsNone(launcher)
|
|
|
|
def test_remote_failure_stops_before_the_helper(self):
|
|
result, calls, launcher, _ = self.run_install("remote")
|
|
self.assertNotEqual(0, result.returncode)
|
|
self.assertIn("== FAIL flathub", result.stdout)
|
|
self.assertNotIn("helper ", calls)
|
|
self.assertIsNone(launcher)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|