From ab94c557c7967f9843b74e2c2e35233c58acdf49 Mon Sep 17 00:00:00 2001 From: niftynei Date: Tue, 19 Jul 2022 17:04:40 +0930 Subject: [PATCH] bkpr: add test for bookkeeper being added after channel has closed We rescan and pick up the channel's close tx, but can't go back and get the open info, since we've already deleted the channel from the database. --- tests/test_bookkeeper.py | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/tests/test_bookkeeper.py b/tests/test_bookkeeper.py index 747fec564..b082504e5 100644 --- a/tests/test_bookkeeper.py +++ b/tests/test_bookkeeper.py @@ -1,6 +1,6 @@ from fixtures import * # noqa: F401,F403 from decimal import Decimal -from pyln.client import Millisatoshi +from pyln.client import Millisatoshi, RpcError from fixtures import TEST_NETWORK from utils import ( sync_blockheight, wait_for, only_one @@ -322,3 +322,57 @@ def test_bookkeeping_rbf_withdraw(node_factory, bitcoind): assert len(fees) == 2 fees = find_tags(l1.rpc.bkpr_listincome(consolidate_fees=True)['income_events'], 'onchain_fee') assert len(fees) == 1 + + +@unittest.skipIf(os.getenv('TEST_DB_PROVIDER', 'sqlite3') != 'sqlite3', "turns off bookkeeper at start") +def test_bookkeeping_onchaind_txs(node_factory, bitcoind): + """ + Test for a channel that's closed, but whose close tx + re-appears in the rescan + """ + l1, l2 = node_factory.line_graph(2, + wait_for_announce=True, + opts={'disable-plugin': 'bookkeeper'}) + + # Double check there's no bookkeeper plugin on + assert l1.daemon.opts['disable-plugin'] == 'bookkeeper' + with pytest.raises(RpcError): + l1.rpc.listincome() + + # Send l2 funds via the channel + l1.pay(l2, 11000000) + bitcoind.generate_block(10) + + # Amicably close the channel, mine 101 blocks (channel forgotten) + l1.rpc.close(l2.info['id']) + l1.wait_for_channel_onchain(l2.info['id']) + + bitcoind.generate_block(101) + sync_blockheight(bitcoind, [l1]) + + l1.daemon.wait_for_log('onchaind complete, forgetting peer') + + # Now turn the bookkeeper on and restart + l1.stop() + del l1.daemon.opts['disable-plugin'] + # Roll back -- close is picked up for a forgotten channel + l1.daemon.opts['rescan'] = 102 + l1.start() + + # Wait for the balance snapshot to fire/finish + l1.daemon.wait_for_log('Snapshot balances updated') + + # We should have the deposit and then the journal entry + events = l1.rpc.bkpr_listaccountevents()['events'] + assert len(events) == 2 + assert events[0]['account'] == 'wallet' + assert events[0]['tag'] == 'deposit' + assert events[1]['account'] == 'wallet' + assert events[1]['tag'] == 'journal_entry' + + wallet_bal = only_one(l1.rpc.bkpr_listbalances()['accounts']) + assert wallet_bal['account'] == 'wallet' + funds = l1.rpc.listfunds() + assert len(funds['channels']) == 0 + outs = sum([out['amount_msat'] for out in funds['outputs']]) + assert outs == only_one(wallet_bal['balances'])['balance_msat']