From bfce4ce6563962512264bcf20ef4403647c9598b Mon Sep 17 00:00:00 2001 From: zebra-lucky Date: Sun, 3 Nov 2024 00:48:13 +0200 Subject: [PATCH] test_onionmc.py: add line protocol, channel tests --- .../joinmarket/tests/jmdaemon/test_onionmc.py | 91 ++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/electrum/plugins/joinmarket/tests/jmdaemon/test_onionmc.py b/electrum/plugins/joinmarket/tests/jmdaemon/test_onionmc.py index f2c0f285c..7906b32d7 100644 --- a/electrum/plugins/joinmarket/tests/jmdaemon/test_onionmc.py +++ b/electrum/plugins/joinmarket/tests/jmdaemon/test_onionmc.py @@ -9,7 +9,8 @@ from electrum.plugins.joinmarket.jmdaemon import ( from electrum.plugins.joinmarket.jmdaemon.onionmc import ( PEER_STATUS_UNCONNECTED, PEER_STATUS_CONNECTED, PEER_STATUS_HANDSHAKED, PEER_STATUS_DISCONNECTED, NOT_SERVING_ONION_HOSTNAME, OnionPeerError, - OnionCustomMessageDecodingError, OnionCustomMessage, JM_MESSAGE_TYPES) + OnionCustomMessageDecodingError, OnionCustomMessage, JM_MESSAGE_TYPES, + OnionPeer, OnionDirectoryPeerNotFound) from electrum.plugins.joinmarket.jmdaemon.onionmc_support import ( TorClientService) @@ -72,6 +73,9 @@ class OnionBaseTestCase(JMTestCase): async def on_pubkey(self, pubkey): print("received pubkey: " + pubkey) + async def on_nick_leave(self, nick, msgchan): + print('simulated on_nick_leave', nick, msgchan) + async def junk_pubmsgs(self, mc): # start a raw IRCMessageChannel instance in a thread; # then call send_* on it with various errant messages @@ -137,6 +141,7 @@ class OnionBaseTestCase(JMTestCase): mc.on_connect = self.on_connect mc.on_disconnect = self.on_disconnect mc.on_welcome = self.on_welcome + mc.on_nick_leave = self.on_nick_leave for p in self.mc.peers: p.connect() p._status = PEER_STATUS_HANDSHAKED @@ -165,6 +170,19 @@ class OnionCustomMessageTestCase(OnionBaseTestCase): assert msg.msgtype == 1 +class OnionLineProtocolTestCase(OnionBaseTestCase): + + async def test_connection_lost(self): + protocol = self.peer.reconnecting_service.protocol + protocol.connection_lost(Exception('dummy connection lost')) + + async def test_line_received(self): + protocol = self.peer.reconnecting_service.protocol + protocol.line_received( + b'{"line": "dummymsg", "type": 1}') + protocol.line_received(b'dummymsg') + + class OnionClientFactoryTestCase(OnionBaseTestCase): async def test_register_disconnection(self): @@ -242,3 +260,74 @@ class OnionPeerTestCase(OnionBaseTestCase): async def test_notify_message_unsendable(self): peer = self.peer peer.notify_message_unsendable() + + +class OnionMessageChannelTestCase(OnionBaseTestCase): + + async def test_info_callback(self): + self.mc.info_callback('dummymsg') + + async def test_setup_error_callback(self): + self.mc.setup_error_callback('dummymsg') + + async def test_shutdown_callback(self): + self.mc.shutdown_callback('dummymsg') + + async def test_get_pubmsg(self): + assert self.mc.get_pubmsg('dummymsg', 'dummynick') == ( + 'dummynick!PUBLICdummymsg') + + async def test_get_privmsg(self): + assert self.mc.get_privmsg( + 'dummynick', 'cmd', 'dummymsg', 'dummy2') == ( + 'dummy2!dummynick!cmd dummymsg') + + async def test_pubmsg(self): + await self.mc._pubmsg('dummymsg') + + async def test_should_try_to_connect(self): + assert not self.mc.should_try_to_connect(None) + mc = self.mc + peer = OnionPeer(mc, mc.socks5_host, mc.socks5_port, + (NOT_SERVING_ONION_HOSTNAME, -1), False, 'dummynick') + assert not self.mc.should_try_to_connect(peer) + peer = OnionPeer(mc, mc.socks5_host, mc.socks5_port, + ('host', 5222), True, 'dummynick') + assert not self.mc.should_try_to_connect(peer) + assert not self.mc.should_try_to_connect(mc.self_as_peer) + peer = OnionPeer(mc, mc.socks5_host, mc.socks5_port, + ('host', 5222), False, 'dummynick') + peer._status = PEER_STATUS_HANDSHAKED + assert not self.mc.should_try_to_connect(peer) + peer._status = PEER_STATUS_UNCONNECTED + assert self.mc.should_try_to_connect(peer) + + async def test_privmsg(self): + await self.mc._privmsg('dummynick', 'cmd', 'dummymsg') + + async def test_announce_orders(self): + await self.mc._announce_orders(['a', 'b', 'c']) + + async def test_get_directory_for_nick(self): + mc = self.mc + dummynick = 'dummynick' + with self.assertRaises(OnionDirectoryPeerNotFound): + mc.get_directory_for_nick(dummynick) + mc.active_directories[dummynick] = {} + with self.assertRaises(OnionDirectoryPeerNotFound): + mc.get_directory_for_nick(dummynick) + mc.active_directories[dummynick][self.peer] = False + with self.assertRaises(OnionDirectoryPeerNotFound): + mc.get_directory_for_nick(dummynick) + mc.active_directories[dummynick][self.peer] = True + assert mc.get_directory_for_nick(dummynick) == self.peer + + async def test_on_nick_leave_directory(self): + mc = self.mc + dp = self.peer + dummynick = 'dummynick' + assert not await mc.on_nick_leave_directory(dummynick, dp) + mc.active_directories[dummynick] = {} + assert not await mc.on_nick_leave_directory(dummynick, dp) + mc.active_directories[dummynick][self.peer] = True + await mc.on_nick_leave_directory(dummynick, dp)