feat: coordinate authoritative playback and audio routing
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
import threading
|
||||
import time
|
||||
import unittest
|
||||
from concurrent.futures import Future
|
||||
from pathlib import Path
|
||||
@@ -194,6 +196,42 @@ class DownloadManagerTests(unittest.TestCase):
|
||||
self.assertFalse(slot.exists())
|
||||
self.assertEqual(self.store.get_slot(1).media_state, "empty")
|
||||
|
||||
def test_shutdown_terminates_tracked_process_without_waiting_for_job_timeout(self):
|
||||
manager = DownloadManager(self.config, self.store)
|
||||
errors = []
|
||||
|
||||
def run_long_process():
|
||||
try:
|
||||
manager._run_command(
|
||||
["/bin/sh", "-c", "sleep 60"],
|
||||
check=True,
|
||||
text=True,
|
||||
timeout=60,
|
||||
capture_output=True,
|
||||
)
|
||||
except BaseException as exc:
|
||||
errors.append(exc)
|
||||
|
||||
worker = threading.Thread(target=run_long_process)
|
||||
worker.start()
|
||||
deadline = time.monotonic() + 2
|
||||
while time.monotonic() < deadline:
|
||||
with manager._lock:
|
||||
if manager._processes:
|
||||
break
|
||||
time.sleep(0.01)
|
||||
else:
|
||||
self.fail("test process did not start")
|
||||
|
||||
started = time.monotonic()
|
||||
manager.shutdown(wait=False)
|
||||
worker.join(timeout=3)
|
||||
self.assertFalse(worker.is_alive())
|
||||
self.assertLess(time.monotonic() - started, 3)
|
||||
self.assertTrue(errors)
|
||||
with manager._lock:
|
||||
self.assertEqual(manager._processes, set())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user