From 252bbe1d2d34e4e0f6c07d383b82f30178f21641 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 19 Sep 2018 13:36:07 +0930 Subject: [PATCH] pytest: don't wait for sendrawtx, wait for expected tx. In particular, test_no_fee_estimate was flaky due to seeing the funding tx being sent. Signed-off-by: Rusty Russell --- tests/test_closing.py | 20 ++++++++++---------- tests/test_connection.py | 18 +++++++++--------- tests/test_misc.py | 2 +- tests/utils.py | 4 ++++ 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/tests/test_closing.py b/tests/test_closing.py index 9eacc727d..271b998f6 100644 --- a/tests/test_closing.py +++ b/tests/test_closing.py @@ -475,7 +475,7 @@ def test_onchain_unwatch(node_factory, bitcoind): l1.rpc.dev_fail(l2.info['id']) l1.daemon.wait_for_log('Failing due to dev-fail command') - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) l1.bitcoin.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') @@ -594,7 +594,7 @@ def test_onchain_dust_out(node_factory, bitcoind, executor): # l1 will drop to chain. l1.daemon.wait_for_log('permfail') - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) l1.bitcoin.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') l2.daemon.wait_for_log(' to ONCHAIN') @@ -662,7 +662,7 @@ def test_onchain_timeout(node_factory, bitcoind, executor): # l1 will drop to chain. l1.daemon.wait_for_log('permfail') - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) l1.bitcoin.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') l2.daemon.wait_for_log(' to ONCHAIN') @@ -814,7 +814,7 @@ def test_onchain_feechange(node_factory, bitcoind, executor): # l2 will drop to chain. l2.daemon.wait_for_log('permfail') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') l2.daemon.wait_for_log(' to ONCHAIN') @@ -890,7 +890,7 @@ def test_onchain_all_dust(node_factory, bitcoind, executor): # l2 will drop to chain. l2.daemon.wait_for_log('permfail') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) # Make l1's fees really high (and wait for it to exceed 50000) l1.set_feerates((100000, 100000, 100000)) @@ -944,7 +944,7 @@ def test_onchain_different_fees(node_factory, bitcoind, executor): # Drop to chain l1.rpc.dev_fail(l2.info['id']) - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') @@ -999,7 +999,7 @@ def test_permfail_new_commit(node_factory, bitcoind, executor): t = executor.submit(l1.pay, l2, 200000000) l2.daemon.wait_for_log('dev_disconnect permfail') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log('Their unilateral tx, new commit point') l1.daemon.wait_for_log(' to ONCHAIN') @@ -1037,7 +1037,7 @@ def test_permfail_htlc_in(node_factory, bitcoind, executor): t = executor.submit(l1.pay, l2, 200000000) l2.daemon.wait_for_log('dev_disconnect permfail') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log('Their unilateral tx, old commit point') l1.daemon.wait_for_log(' to ONCHAIN') @@ -1082,7 +1082,7 @@ def test_permfail_htlc_out(node_factory, bitcoind, executor): t = executor.submit(l2.pay, l1, 200000000) l2.daemon.wait_for_log('dev_disconnect permfail') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log('Their unilateral tx, old commit point') l1.daemon.wait_for_log(' to ONCHAIN') @@ -1144,7 +1144,7 @@ def test_permfail(node_factory, bitcoind): # We fail l2, so l1 will reconnect to it. l2.rpc.dev_fail(l1.info['id']) l2.daemon.wait_for_log('Failing due to dev-fail command') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) assert l1.bitcoin.rpc.getmempoolinfo()['size'] == 1 diff --git a/tests/test_connection.py b/tests/test_connection.py index 4fa257f9a..5c30f8b56 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -783,7 +783,7 @@ def test_channel_persistence(node_factory, bitcoind, executor): # Now make sure l1 is watching for unilateral closes l2.rpc.dev_fail(l1.info['id']) l2.daemon.wait_for_log('Failing due to dev-fail command') - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) # L1 must notice. @@ -836,8 +836,8 @@ def test_update_fee(node_factory, bitcoind): l2.daemon.wait_for_log(' to CLOSINGD_COMPLETE') # And should put closing into mempool. - l1.daemon.wait_for_log('sendrawtx exit 0') - l2.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') @@ -925,8 +925,8 @@ def test_update_fee_reconnect(node_factory, bitcoind): l1.rpc.close(chan) # And should put closing into mempool. - l1.daemon.wait_for_log('sendrawtx exit 0') - l2.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) + l2.wait_for_channel_onchain(l1.info['id']) bitcoind.generate_block(1) l1.daemon.wait_for_log(' to ONCHAIN') @@ -1150,7 +1150,7 @@ def test_no_fee_estimate(node_factory, bitcoind, executor): l1.daemon.wait_for_log('sendrawtx exit 0') l1.rpc.dev_fail(l2.info['id']) l1.daemon.wait_for_log('Failing due to dev-fail command') - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) bitcoind.generate_block(6) wait_for(lambda: only_one(l1.rpc.getpeer(l2.info['id'])['channels'])['state'] == 'ONCHAIN') wait_for(lambda: only_one(l2.rpc.getpeer(l1.info['id'])['channels'])['state'] == 'ONCHAIN') @@ -1172,9 +1172,9 @@ def test_no_fee_estimate(node_factory, bitcoind, executor): l2.pay(l1, 10**9 // 2) l1.rpc.dev_fail(l2.info['id']) l1.daemon.wait_for_log('Failing due to dev-fail command') - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) bitcoind.generate_block(5) - l1.daemon.wait_for_log('sendrawtx exit 0') + wait_for(lambda: len(bitcoind.rpc.getrawmempool()) > 0) bitcoind.generate_block(100) # Start estimatesmartfee. @@ -1280,7 +1280,7 @@ def test_dataloss_protection(node_factory, bitcoind): l2.daemon.wait_for_log("Peer permanent failure in CHANNELD_NORMAL: Awaiting unilateral close") # l1 should drop to chain. - l1.daemon.wait_for_log('sendrawtx exit 0') + l1.wait_for_channel_onchain(l2.info['id']) # l2 must NOT drop to chain. l2.daemon.wait_for_log("Cannot broadcast our commitment tx: they have a future one") diff --git a/tests/test_misc.py b/tests/test_misc.py index a52d0cf4e..c57f6a44e 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -182,7 +182,7 @@ def test_htlc_sig_persistence(node_factory, executor): # This should reload the htlc_sig l2.rpc.dev_fail(l1.info['id']) # Make sure it broadcasts to chain. - l2.daemon.wait_for_log('sendrawtx exit 0') + l2.wait_for_channel_onchain(l1.info['id']) l2.stop() l1.bitcoin.rpc.generate(1) l1.start() diff --git a/tests/utils.py b/tests/utils.py index 38c549347..565d306e6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -560,6 +560,10 @@ class LightningNode(object): active = [(c['short_channel_id'], c['flags']) for c in channels if c['active']] return (chanid, 0) in active and (chanid, 1) in active + def wait_for_channel_onchain(self, peerid): + txid = only_one(only_one(self.rpc.listpeers(peerid)['peers'])['channels'])['scratch_txid'] + wait_for(lambda: txid in self.bitcoin.rpc.getrawmempool()) + def wait_channel_active(self, chanid): wait_for(lambda: self.is_channel_active(chanid), interval=1)