Add Cthulhu Remote plugin

This commit is contained in:
2026-05-20 22:36:17 -04:00
parent 009938c495
commit b055933d6d
13 changed files with 982 additions and 1 deletions
+66
View File
@@ -0,0 +1,66 @@
import sys
import types
import unittest
from pathlib import Path
from unittest import mock
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
input_event_manager_stub = types.ModuleType("cthulhu.input_event_manager")
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.plugins.CthulhuRemote.connection_info import ConnectionInfo, ConnectionMode
from cthulhu.plugins.CthulhuRemote.local_machine import LocalMachine
from cthulhu.plugins.CthulhuRemote.protocol import RemoteMessageType
from cthulhu.plugins.CthulhuRemote.serializer import JSONSerializer
class CthulhuRemotePluginTests(unittest.TestCase):
def test_connection_info_accepts_nvda_remote_style_fields(self):
info = ConnectionInfo.from_url("cthulhuremote://example.com:1234?key=abc&mode=slave")
self.assertEqual(info.hostname, "example.com")
self.assertEqual(info.port, 1234)
self.assertEqual(info.key, "abc")
self.assertEqual(info.mode, ConnectionMode.SLAVE)
self.assertEqual(
info.get_url_to_connect(),
"cthulhuremote://example.com:1234?key=abc&mode=master",
)
def test_json_serializer_uses_remote_message_type_values(self):
serializer = JSONSerializer()
payload = serializer.deserialize(serializer.serialize(RemoteMessageType.join, channel="abc"))
self.assertEqual(payload["type"], "join")
self.assertEqual(payload["channel"], "abc")
def test_local_machine_maps_common_windows_vk_codes_to_keyvals(self):
machine = LocalMachine(lambda message: None)
self.assertEqual(machine._resolve_keyval(0x41, None), machine._resolve_keyval(None, "a"))
self.assertEqual(machine._resolve_keyval(0x70, None), machine._resolve_keyval(None, "F1"))
self.assertIsNone(machine._resolve_keyval(0xFF, None))
@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()
app = mock.Mock()
app.getSignalManager.return_value = mock.Mock()
app.getAPIHelper.return_value = None
manager = PluginSystemManager(app)
manager.rescanPlugins()
plugin_info = manager._resolve_plugin_info("CthulhuRemote")
self.assertIsNotNone(plugin_info)
self.assertTrue(manager.loadPlugin(plugin_info))
self.assertEqual(plugin_info.instance.__class__.__name__, "CthulhuRemote")
self.assertTrue(manager.unloadPlugin(plugin_info))
if __name__ == "__main__":
unittest.main()