mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 02:51:10 +00:00
66 lines
2.9 KiB
Python
66 lines
2.9 KiB
Python
import json
|
|
import os
|
|
from pathlib import Path
|
|
import socket
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
|
|
|
|
SOURCE = Path(__file__).resolve().parents[1] / 'linuxfs/overlay/usr/local/bin/droiddeck-steamvr-game'
|
|
|
|
|
|
class SteamVrGameTest(unittest.TestCase):
|
|
def setUp(self):
|
|
temporary = tempfile.TemporaryDirectory()
|
|
self.addCleanup(temporary.cleanup)
|
|
self.root = Path(temporary.name)
|
|
self.helper = self.root / 'helper'
|
|
self.assertIn('/run/droiddeck/droiddeck-xr-frames', SOURCE.read_text())
|
|
self.helper.write_text(SOURCE.read_text().replace('/run/droiddeck/droiddeck-xr-frames',
|
|
str(self.root / 'droiddeck-xr-frames')), encoding='utf-8')
|
|
self.command('pgrep', '#!/bin/sh\nexit 0\n')
|
|
self.command('gamescope', '#!/usr/bin/env python3\nimport json, os, sys\n'
|
|
'print(json.dumps(dict(argv=sys.argv[1:], modifiers=os.getenv("gamescope_vr_use_modifiers"), '
|
|
'layers=os.getenv("VK_INSTANCE_LAYERS"))))\n')
|
|
self.env = {key: value for key, value in os.environ.items()
|
|
if not key.startswith(('gamescope_vr_', 'VK_'))}
|
|
self.env.update(PATH=str(self.root) + os.pathsep + os.environ['PATH'],
|
|
XDG_RUNTIME_DIR=str(self.root))
|
|
|
|
def command(self, name, text):
|
|
path = self.root / name
|
|
path.write_text(text, encoding='utf-8')
|
|
path.chmod(0o755)
|
|
|
|
def run_game(self, *args):
|
|
return subprocess.run(['sh', str(self.helper), *args], env=self.env,
|
|
capture_output=True, text=True, timeout=5)
|
|
|
|
def test_native_backend_preserves_command_arguments_and_nonquest_defaults(self):
|
|
result = self.run_game('game with spaces', 'a b', '$literal')
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
data = json.loads(result.stdout)
|
|
self.assertEqual(data['argv'][:2], ['--backend', 'openvr'])
|
|
self.assertEqual(data['argv'][-4:], ['--', 'game with spaces', 'a b', '$literal'])
|
|
self.assertIsNone(data['modifiers'])
|
|
self.assertEqual(data['layers'], 'VK_LAYER_DROIDDECK_vr')
|
|
|
|
def test_quest_selects_vulkan_sharing_and_preserves_explicit_override(self):
|
|
with socket.socket(socket.AF_UNIX) as receiver:
|
|
receiver.bind(str(self.root / 'droiddeck-xr-frames'))
|
|
self.assertEqual(json.loads(self.run_game('game').stdout)['modifiers'], 'false')
|
|
self.env['gamescope_vr_use_modifiers'] = 'true'
|
|
self.assertEqual(json.loads(self.run_game('game').stdout)['modifiers'], 'true')
|
|
|
|
def test_missing_runtime_and_missing_command_fail_clearly(self):
|
|
self.assertEqual(self.run_game().returncode, 2)
|
|
self.command('pgrep', '#!/bin/sh\nexit 1\n')
|
|
result = self.run_game('game')
|
|
self.assertEqual(result.returncode, 1)
|
|
self.assertIn('Start SteamVR', result.stderr)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|