1
0

Merge pull request #10283 from f321x/fix_add_peer

cli: fix add_peer command
This commit is contained in:
ghost43
2025-10-28 16:15:18 +00:00
committed by GitHub
2 changed files with 44 additions and 1 deletions

View File

@@ -33,6 +33,7 @@ import binascii
import base64 import base64
import asyncio import asyncio
import inspect import inspect
from asyncio import CancelledError
from collections import defaultdict from collections import defaultdict
from functools import wraps from functools import wraps
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
@@ -44,6 +45,7 @@ import electrum_ecc as ecc
from . import util from . import util
from .lnmsg import OnionWireSerializer from .lnmsg import OnionWireSerializer
from .lnworker import LN_P2P_NETWORK_TIMEOUT
from .logging import Logger from .logging import Logger
from .onion_message import create_blinded_path, send_onion_message_to from .onion_message import create_blinded_path, send_onion_message_to
from .submarine_swaps import NostrTransport from .submarine_swaps import NostrTransport
@@ -1684,7 +1686,12 @@ class Commands(Logger):
arg:int:timeout:Timeout in seconds (default=20) arg:int:timeout:Timeout in seconds (default=20)
""" """
lnworker = self.network.lngossip if gossip else wallet.lnworker lnworker = self.network.lngossip if gossip else wallet.lnworker
await lnworker.add_peer(connection_string) peer = await lnworker.add_peer(connection_string)
try:
await util.wait_for2(peer.initialized, timeout=LN_P2P_NETWORK_TIMEOUT)
except (CancelledError, Exception) as e:
# FIXME often simply CancelledError and real cause (e.g. timeout) remains hidden
raise UserFacingException(f"Connection failed: {repr(e)}")
return True return True
@command('wnl') @command('wnl')

View File

@@ -1,3 +1,4 @@
import asyncio
import binascii import binascii
import datetime import datetime
import os.path import os.path
@@ -740,3 +741,38 @@ class TestCommandsTestnet(ElectrumTestCase):
assert await cmds.export_lightning_preimage(payment_hash=payment_hash.hex(), wallet=w) == preimage.hex() assert await cmds.export_lightning_preimage(payment_hash=payment_hash.hex(), wallet=w) == preimage.hex()
assert await cmds.export_lightning_preimage(payment_hash=os.urandom(32).hex(), wallet=w) is None assert await cmds.export_lightning_preimage(payment_hash=os.urandom(32).hex(), wallet=w) is None
@mock.patch.object(wallet.Abstract_Wallet, 'save_db')
@mock.patch('electrum.commands.LN_P2P_NETWORK_TIMEOUT', 0.001)
async def test_add_peer(self, *mock_args):
w = restore_wallet_from_text__for_unittest(
'disagree rug lemon bean unaware square alone beach tennis exhibit fix mimic',
path='if_this_exists_mocking_failed_648151893',
config=self.config)['wallet']
cmds = Commands(config=self.config)
# Mock the network and lnworker
mock_lnworker = mock.Mock()
w.lnworker = mock_lnworker
mock_peer = mock.Mock()
mock_peer.initialized = asyncio.Future()
connection_string = "test_node_id@127.0.0.1:9735"
called = False
async def lnworker_add_peer(*args, **kwargs):
assert args[0] == connection_string
nonlocal called
called += 1
return mock_peer
mock_lnworker.add_peer = lnworker_add_peer
# check if add_peer times out if peer doesn't initialize (LN_P2P_NETWORK_TIMEOUT is 0.001s)
with self.assertRaises(UserFacingException):
await cmds.add_peer(connection_string=connection_string, wallet=w)
# check if add_peer called lnworker.add_peer
assert called == 1
mock_peer.initialized = asyncio.Future()
mock_peer.initialized.set_result(True)
# check if add_peer returns True if peer is initialized
result = await cmds.add_peer(connection_string=connection_string, wallet=w)
assert called == 2
self.assertTrue(result)