From 8dcfe1a75ce4ced140419a4c4696e7cf4991c2de Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:48 +1030 Subject: [PATCH] pytest: make test_splice_gossip more precise. Check the exact scids. Makes it simpler when failures occur. Signed-off-by: Rusty Russell --- tests/test_splicing.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/tests/test_splicing.py b/tests/test_splicing.py index d48e0287b..345ce6611 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -3,7 +3,7 @@ import pytest import unittest import time from utils import ( - wait_for, TEST_NETWORK + wait_for, TEST_NETWORK, first_scid, only_one ) @@ -50,6 +50,7 @@ def test_splice_gossip(node_factory, bitcoind): l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) chan_id = l1.get_channel_id(l2) + pre_splice_scid = first_scid(l1, l2) # add extra sats to pay fee funds_result = l1.rpc.fundpsbt("109000sat", "slow", 166, excess_as_change=True) @@ -59,30 +60,42 @@ def test_splice_gossip(node_factory, bitcoind): result = l1.rpc.signpsbt(result['psbt']) result = l1.rpc.splice_signed(chan_id, result['signed_psbt']) - l2.daemon.wait_for_log(r'CHANNELD_NORMAL to CHANNELD_AWAITING_SPLICE') - l1.daemon.wait_for_log(r'CHANNELD_NORMAL to CHANNELD_AWAITING_SPLICE') + wait_for(lambda: only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_AWAITING_SPLICE') + wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['state'] == 'CHANNELD_AWAITING_SPLICE') - mempool = bitcoind.rpc.getrawmempool(True) - assert len(list(mempool.keys())) == 1 - assert result['txid'] in list(mempool.keys()) + bitcoind.generate_block(6, wait_for_mempool=result['txid']) - bitcoind.generate_block(6, wait_for_mempool=1) + # l3 will see channel dying, but still consider it OK for 12 blocks. + l3.daemon.wait_for_log(f'gossipd: channel {pre_splice_scid} closing soon due to the funding outpoint being spent') + assert len(l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels']) == 2 + assert len(l3.rpc.listchannels(source=l1.info['id'])['channels']) == 1 - l2.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') - l1.daemon.wait_for_log(r'CHANNELD_AWAITING_SPLICE to CHANNELD_NORMAL') + wait_for(lambda: only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL') + wait_for(lambda: only_one(l1.rpc.listpeerchannels(l2.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL') - # l3 should see the old channel and new channel at the same time here - wait_for(lambda: len(l3.rpc.listchannels()['channels']) == 6) + post_splice_scid = first_scid(l1, l2) + assert post_splice_scid != pre_splice_scid + + # l3 should see the new channel now. + wait_for(lambda: l3.rpc.listchannels(short_channel_id=post_splice_scid)['channels'] != []) + assert len(l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels']) == 2 bitcoind.generate_block(7) # The old channel should fall off l3's perspective - wait_for(lambda: len(l3.rpc.listchannels()['channels']) == 4) + wait_for(lambda: l3.rpc.listchannels(short_channel_id=pre_splice_scid)['channels'] == []) + assert len(l3.rpc.listchannels(short_channel_id=post_splice_scid)['channels']) == 2 # Check that the splice doesn't generate a unilateral close transaction time.sleep(5) assert l1.db_query("SELECT count(*) as c FROM channeltxs;")[0]['c'] == 0 + # Still looks normal from both sides + assert only_one(l1.rpc.listpeerchannels()['channels'])['short_channel_id'] == post_splice_scid + assert only_one(l1.rpc.listpeerchannels()['channels'])['state'] == 'CHANNELD_NORMAL' + assert only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['short_channel_id'] == post_splice_scid + assert only_one(l2.rpc.listpeerchannels(l1.info['id'])['channels'])['state'] == 'CHANNELD_NORMAL' + # Check for channel announcement failure assert not l1.daemon.is_in_log("invalid local_channel_announcement") assert not l2.daemon.is_in_log("invalid local_channel_announcement")