tests: lnpeer: add test_payment_with_malformed_onion
Adds a simple forwarding test where the receiver fails a malformed onion with `update_fail_malformed_htlc`.
This commit is contained in:
@@ -2866,6 +2866,45 @@ class TestPeerForwarding(TestPeer):
|
|||||||
assert len(bob_hm.all_htlcs_ever()) == 2
|
assert len(bob_hm.all_htlcs_ever()) == 2
|
||||||
assert all(bob_hm.was_htlc_failed(htlc_id=htlc.htlc_id, htlc_proposer=HTLCOwner.REMOTE) for (_, htlc) in bob_hm.all_htlcs_ever())
|
assert all(bob_hm.was_htlc_failed(htlc_id=htlc.htlc_id, htlc_proposer=HTLCOwner.REMOTE) for (_, htlc) in bob_hm.all_htlcs_ever())
|
||||||
|
|
||||||
|
async def test_payment_with_malformed_onion(self):
|
||||||
|
"""
|
||||||
|
Alice -> Bob -> Carol. Carol fails htlc with update_fail_malformed_htlc because she is unable
|
||||||
|
to parse the onion Alice sent to her.
|
||||||
|
"""
|
||||||
|
graph = self.prepare_chans_and_peers_in_graph(self.GRAPH_DEFINITIONS['line_graph'])
|
||||||
|
peers = graph.peers.values()
|
||||||
|
|
||||||
|
async def pay(lnaddr, pay_req):
|
||||||
|
self.assertEqual(PR_UNPAID, graph.workers['carol'].get_payment_status(lnaddr.paymenthash))
|
||||||
|
result, log = await graph.workers['alice'].pay_invoice(pay_req)
|
||||||
|
self.assertEqual(OnionFailureCode.INVALID_ONION_VERSION, log[0].failure_msg.code)
|
||||||
|
self.assertFalse(result, msg=log)
|
||||||
|
raise PaymentFailure()
|
||||||
|
|
||||||
|
# this will make carol send update_fail_malformed_htlc
|
||||||
|
graph.workers['carol'].config.TEST_FAIL_HTLCS_AS_MALFORMED = True
|
||||||
|
|
||||||
|
async def f():
|
||||||
|
async with OldTaskGroup() as group:
|
||||||
|
for peer in peers:
|
||||||
|
await group.spawn(peer._message_loop())
|
||||||
|
await group.spawn(peer.htlc_switch())
|
||||||
|
for peer in peers:
|
||||||
|
await peer.initialized
|
||||||
|
lnaddr, pay_req = self.prepare_invoice(graph.workers['carol'], include_routing_hints=True)
|
||||||
|
await group.spawn(pay(lnaddr, pay_req))
|
||||||
|
|
||||||
|
with self.assertLogs('electrum', level='INFO') as logs:
|
||||||
|
with self.assertRaises(PaymentFailure):
|
||||||
|
await f()
|
||||||
|
self.assertTrue(
|
||||||
|
any('carol->bob' in msg and 'fail_malformed_htlc' in msg for msg in logs.output)
|
||||||
|
)
|
||||||
|
self.assertTrue(
|
||||||
|
any('bob->carol' in msg and 'on_update_fail_malformed_htlc' in msg for msg in logs.output)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestPeerDirectAnchors(TestPeerDirect):
|
class TestPeerDirectAnchors(TestPeerDirect):
|
||||||
TEST_ANCHOR_CHANNELS = True
|
TEST_ANCHOR_CHANNELS = True
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user