tests: rm TestPeerDirect::test_dont_settle_htlcs
What changed, and why it matters
This commit simply removes an automated test that had become redundant because a newer test covers the same behavior more thoroughly. It does not change any production code, user-facing behavior, or security mechanism.
No security action needed. This is a routine test-suite cleanup. Reviewers may optionally confirm that the replacement test indeed exercises the receiver behavior previously covered by the removed test.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit deletes TestPeerDirect::test_dont_settle_htlcs from tests/test_lnpeer.py. The deleted test verified that HTLCs registered in LNWallet.dont_settle_htlcs are not settled even when the preimage is available. The commit message states this is now covered by TestPeerForwarding::test_dont_settle_htlcs_receiver_and_forwarder, which tests both receiver and forwarder roles, making the old receiver-only test obsolete. No application code is modified.
Changed components
tests/test_lnpeer.pyInspect captured patch +0 / −70
diff --git a/tests/test_lnpeer.py b/tests/test_lnpeer.py
index 344c268..df62ddb 100644
--- a/tests/test_lnpeer.py
+++ b/tests/test_lnpeer.py
@@ -2016,76 +2016,6 @@ class TestPeerDirect(TestPeer):
with self.assertRaises(SuccessfulTest):
await f()
- async def test_dont_settle_htlcs(self):
- """
- Test that htlcs registered in LNWallet.dont_settle_htlcs don't get fulfilled if the preimage is available.
- """
- async def run_test(test_trampoline, test_failure):
- alice_channel, bob_channel = create_test_channels()
- p1, p2, w1, w2, _q1, _q2 = self.prepare_peers(alice_channel, bob_channel)
- if test_trampoline:
- await self._activate_trampoline(w1)
- # declare bob as trampoline node
- electrum.trampoline._TRAMPOLINE_NODES_UNITTESTS = {
- 'bob': LNPeerAddr(host="127.0.0.1", port=9735, pubkey=w2.node_keypair.pubkey),
- }
-
- preimage = os.urandom(32)
- lnaddr, pay_req = self.prepare_invoice(
- w2,
- payment_preimage=preimage,
- # use a higher min final cltv delta so we can mine some blocks later
- min_final_cltv_delta=244,
- )
-
- # add payment_hash to dont_settle_htlcs so the htlcs are not getting settled
- w2.dont_settle_htlcs[pay_req.rhash] = None
-
- async def pay(lnaddr, pay_req):
- self.assertEqual(PR_UNPAID, w2.get_payment_status(lnaddr.paymenthash, direction=RECEIVED))
- result, log = await util.wait_for2(w1.pay_invoice(pay_req), timeout=3)
- if result is True:
- self.assertNotIn(pay_req.rhash, w2.dont_settle_htlcs)
- self.assertEqual(PR_PAID, w2.get_payment_status(lnaddr.paymenthash, direction=RECEIVED))
- return PaymentDone()
- else:
- self.assertIsNone(w2.get_preimage(lnaddr.paymenthash))
- return PaymentFailure()
-
- async def wait_for_htlcs():
- payment_key = w2._get_payment_key(lnaddr.paymenthash)
- while payment_key.hex() not in w2.received_mpp_htlcs:
- await asyncio.sleep(0.05)
- w2.network.blockchain()._height += 25 # mine some blocks, shouldn't affect anything
- if test_failure:
- # delete preimage, this will fail htlcs even if registered in dont_settle_htlcs
- del w2._preimages[pay_req.rhash]
- return # pay() should fail now
- await asyncio.sleep(0.25) # give w2 some time to do mistakes
- self.assertEqual(w2.received_mpp_htlcs[payment_key.hex()].resolution, RecvMPPResolution.COMPLETE)
- # remove the payment hash from dont_settle_htlcs so the htlcs can get fulfilled
- del w2.dont_settle_htlcs[pay_req.rhash]
-
- async def f():
- async with OldTaskGroup() as group:
- await group.spawn(p1._message_loop())
- await group.spawn(p1.htlc_switch())
- await group.spawn(p2._message_loop())
- await group.spawn(p2.htlc_switch())
- await asyncio.sleep(0.01)
- invoice_features = lnaddr.get_features()
- self.assertFalse(invoice_features.supports(LnFeatures.BASIC_MPP_OPT))
- pay_task = await group.spawn(pay(lnaddr, pay_req))
- await util.wait_for2(wait_for_htlcs(), timeout=2)
- raise await pay_task
-
- await f()
-
- for test_trampoline in [False, True]:
- for test_failure in [False, True]:
- with self.assertRaises(PaymentFailure if test_failure else PaymentDone):
- await run_test(test_trampoline, test_failure)
-
async def test_dont_expire_htlcs(self):
"""
Test that htlcs registered in LNWallet.dont_expire_htlcs don't get expired before the
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.