Files
DroidDeck/tools/tests/test_emulators_install.py
T

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()