Improve Cthulhu Remote speech relay

This commit is contained in:
Storm Dragon
2026-05-21 00:32:00 -04:00
parent b055933d6d
commit cb553d3031
5 changed files with 336 additions and 6 deletions
+63
View File
@@ -11,8 +11,11 @@ input_event_manager_stub.get_manager = mock.Mock(return_value=mock.Mock())
sys.modules["cthulhu.input_event_manager"] = input_event_manager_stub
from cthulhu.plugin_system_manager import PluginSystemManager
from cthulhu import cthulhu_state
from cthulhu import speech
from cthulhu.plugins.CthulhuRemote.connection_info import ConnectionInfo, ConnectionMode
from cthulhu.plugins.CthulhuRemote.local_machine import LocalMachine
from cthulhu.plugins.CthulhuRemote.plugin import CthulhuRemote
from cthulhu.plugins.CthulhuRemote.protocol import RemoteMessageType
from cthulhu.plugins.CthulhuRemote.serializer import JSONSerializer
@@ -45,6 +48,66 @@ class CthulhuRemotePluginTests(unittest.TestCase):
self.assertEqual(machine._resolve_keyval(0x70, None), machine._resolve_keyval(None, "F1"))
self.assertIsNone(machine._resolve_keyval(0xFF, None))
def test_speech_monitor_callbacks_are_additive(self):
primary = mock.Mock()
listener = mock.Mock()
speech.set_monitor_callbacks(writeText=primary)
speech.add_monitor_callback(listener)
self.addCleanup(speech.set_monitor_callbacks, None)
self.addCleanup(speech.remove_monitor_callback, listener)
speech._write_to_monitor("status")
primary.assert_called_once_with("status")
listener.assert_called_once_with("status")
def test_remote_speech_does_not_echo_to_monitor_callbacks(self):
listener = mock.Mock()
speech.add_monitor_callback(listener)
self.addCleanup(speech.remove_monitor_callback, listener)
with (
mock.patch.object(speech, "_speechserver", None),
mock.patch.object(speech.speech_history, "add"),
mock.patch.object(cthulhu_state, "activeScript", None),
):
LocalMachine(lambda message: None).speak(["remote", "status"])
listener.assert_not_called()
def test_slave_mode_forwards_local_speech_to_relay(self):
plugin = CthulhuRemote()
plugin._connectionInfo = ConnectionInfo(
hostname="example.com",
port=1234,
key="abc",
mode=ConnectionMode.SLAVE,
)
plugin._transport = mock.Mock()
plugin._transport.connected = True
plugin._send_local_speech("focused button")
plugin._transport.send.assert_called_once_with(
RemoteMessageType.speak,
sequence=["focused button"],
)
def test_master_mode_does_not_forward_local_speech_to_relay(self):
plugin = CthulhuRemote()
plugin._connectionInfo = ConnectionInfo(
hostname="example.com",
port=1234,
key="abc",
mode=ConnectionMode.MASTER,
)
plugin._transport = mock.Mock()
plugin._transport.connected = True
plugin._send_local_speech("local status")
plugin._transport.send.assert_not_called()
@mock.patch("cthulhu.plugin_system_manager.dbus_service.get_remote_controller")
def test_plugin_manager_can_load_cthulhu_remote(self, remote_controller):
remote_controller.return_value = mock.Mock()