Removed auto as a hardware synth device option. It was too flakey.

This commit is contained in:
Storm Dragon
2026-05-23 18:58:55 -04:00
parent 618987546a
commit ce43d64e77
11 changed files with 20 additions and 429 deletions
+3 -281
View File
@@ -1,6 +1,5 @@
import os
import select
import termios
import time
from unittest.mock import ANY
from unittest.mock import Mock
@@ -105,20 +104,8 @@ def test_litetalk_driver_writes_settings_and_cancel(serial_pair):
speech_driver.shutdown()
def test_configured_device_supports_classic_serial(
monkeypatch, serial_pair
):
def test_configured_device_supports_classic_serial(serial_pair):
master_fd, slave_name = serial_pair
def fake_glob(pattern):
if pattern == "/dev/ttyS*":
return [slave_name]
return []
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
fake_glob,
)
speech_driver = litetalkDriver.driver()
speech_driver.initialize(build_environment(slave_name))
try:
@@ -142,272 +129,7 @@ def test_configured_device_strips_inline_comment(serial_pair):
speech_driver.shutdown()
def test_auto_device_detection_prefers_probe_response(monkeypatch):
opened_ports = []
closed_ports = []
writes = {}
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
lambda pattern: ["/dev/ttyUSB0", "/dev/ttyUSB1"]
if pattern == "/dev/ttyUSB*"
else [],
)
def fake_open(device, flags):
port = 100 + len(opened_ports)
opened_ports.append((device, port))
return port
def fake_write(port, data):
writes.setdefault(port, b"")
writes[port] += data
return len(data)
def fake_select(readable, writable, exceptional, timeout):
port = readable[0]
if timeout == 0:
return [], writable, exceptional
assert timeout == 3.5
if port == 101 and writes.get(port) == b"\x01I":
return readable, writable, exceptional
return [], writable, exceptional
def fake_read(port, size):
if port == 101:
return b"RPItalk 1.3\r"
return b""
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.open",
fake_open,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.close",
lambda port: closed_ports.append(port),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.write",
fake_write,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.read",
fake_read,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.select.select",
fake_select,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcgetattr",
lambda port: [0, 0, 0, 0, 0, 0, [0] * 32],
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcsetattr",
lambda port, when, attrs: None,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.tty.setraw",
lambda port: None,
)
speech_driver = litetalkDriver.driver()
speech_driver.initialize(build_environment("auto"))
try:
assert opened_ports == [("/dev/ttyUSB0", 100), ("/dev/ttyUSB1", 101)]
assert writes == {100: b"\x01I", 101: b"\x01I"}
assert closed_ports == [100]
assert speech_driver.device == "/dev/ttyUSB1"
finally:
speech_driver.shutdown()
def test_auto_device_detection_fails_without_probe_response(
monkeypatch
):
opened_ports = []
closed_ports = []
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
lambda pattern: ["/dev/ttyUSB0", "/dev/ttyUSB1"]
if pattern == "/dev/ttyUSB*"
else [],
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.open",
lambda device, flags: opened_ports.append(device) or len(opened_ports),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.close",
lambda port: closed_ports.append(port),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.write",
lambda port, data: len(data),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.select.select",
lambda readable, writable, exceptional, timeout: (
[],
writable,
exceptional,
),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcgetattr",
lambda port: [0, 0, 0, 0, 0, 0, [0] * 32],
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcsetattr",
lambda port, when, attrs: None,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.tty.setraw",
lambda port: None,
)
speech_driver = litetalkDriver.driver()
with pytest.raises(RuntimeError, match="hardware speech device"):
speech_driver.initialize(build_environment("auto"))
assert opened_ports == ["/dev/ttyUSB0", "/dev/ttyUSB1"]
assert closed_ports == [1, 2]
assert speech_driver.device == "auto"
def test_auto_device_detection_deduplicates_serial_by_id(monkeypatch):
opened_devices = []
def fake_glob(pattern):
if pattern == "/dev/serial/by-id/*":
return ["/dev/serial/by-id/modem0"]
if pattern == "/dev/ttyUSB*":
return ["/dev/ttyUSB0"]
return []
def fake_realpath(path):
if path in ("/dev/serial/by-id/modem0", "/dev/ttyUSB0"):
return "/dev/ttyUSB0"
return path
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
fake_glob,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.path.realpath",
fake_realpath,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.open",
lambda device, flags: opened_devices.append(device)
or len(opened_devices),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.close",
lambda port: None,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.write",
lambda port, data: len(data),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.select.select",
lambda readable, writable, exceptional, timeout: (
[],
writable,
exceptional,
),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcgetattr",
lambda port: [0, 0, 0, 0, 0, 0, [0] * 32],
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcsetattr",
lambda port, when, attrs: None,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.tty.setraw",
lambda port: None,
)
speech_driver = litetalkDriver.driver()
with pytest.raises(RuntimeError, match="hardware speech device"):
speech_driver.initialize(build_environment("auto"))
assert opened_devices == ["/dev/serial/by-id/modem0"]
def test_auto_device_detection_skips_termios_failures(monkeypatch):
opened_ports = []
closed_ports = []
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
lambda pattern: ["/dev/ttyUSB0", "/dev/ttyUSB1"]
if pattern == "/dev/ttyUSB*"
else [],
)
def fake_open(device, flags):
port = 100 + len(opened_ports)
opened_ports.append((device, port))
return port
def fake_tcgetattr(port):
if port == 100:
raise termios.error(5, "Input/output error")
return [0, 0, 0, 0, 0, 0, [0] * 32]
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.open",
fake_open,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.close",
lambda port: closed_ports.append(port),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.write",
lambda port, data: len(data),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.select.select",
lambda readable, writable, exceptional, timeout: (
[],
writable,
exceptional,
),
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcgetattr",
fake_tcgetattr,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcsetattr",
lambda port, when, attrs: None,
)
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.tty.setraw",
lambda port: None,
)
speech_driver = litetalkDriver.driver()
with pytest.raises(RuntimeError, match="hardware speech device"):
speech_driver.initialize(build_environment("auto"))
assert opened_ports == [("/dev/ttyUSB0", 100), ("/dev/ttyUSB1", 101)]
assert closed_ports == [100, 101]
assert speech_driver.device == "auto"
def test_auto_device_detection_fails_when_no_serial_device(monkeypatch):
monkeypatch.setattr(
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
lambda pattern: [],
)
def test_auto_device_is_rejected():
speech_driver = litetalkDriver.driver()
with pytest.raises(RuntimeError, match="hardware speech device"):
@@ -415,7 +137,7 @@ def test_auto_device_detection_fails_when_no_serial_device(monkeypatch):
debug_manager = speech_driver.env["runtime"]["DebugManager"]
debug_manager.write_debug_out.assert_called_with(
"Hardware speech device not found",
"Hardware speech requires an explicit serial device",
ANY,
on_any_level=True,
)