From b7e8ee4445bd3792375c32bd01b4648e0a297d36 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 2 Jan 2018 14:32:33 +1030 Subject: [PATCH] test_lightningd: make sure onchaind recognizes outputs in htlc onchain tests. We stopped too early; we should continue and make sure it all goes well. This means we have to fix them to be deterministic: by generating 2 blocks at once in test_htlc_in_timeout, we raced between fulfill and timeout on the HTLC. Now it's always fulfilled. Also, fixed confusing comments: l1 doesn't drop to chain. Signed-off-by: Rusty Russell --- tests/test_lightningd.py | 42 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/tests/test_lightningd.py b/tests/test_lightningd.py index 880c072aa..7f1af002b 100644 --- a/tests/test_lightningd.py +++ b/tests/test_lightningd.py @@ -1694,13 +1694,13 @@ class LightningDTests(BaseLightningDTests): payfuture = self.executor.submit(l1.rpc.pay, inv) - # l1 will drop to chain, not reconnect. + # l1 will disconnect, and not reconnect. l1.daemon.wait_for_log('dev_disconnect: @WIRE_REVOKE_AND_ACK') # Takes 6 blocks to timeout (cltv-final + 1), but we also give grace period of 1 block. bitcoind.generate_block(5 + 1) assert not l1.daemon.is_in_log('hit deadline') - bitcoind.generate_block(2) + bitcoind.generate_block(1) l1.daemon.wait_for_log('Offered HTLC 0 SENT_ADD_ACK_REVOCATION cltv .* hit deadline') l1.daemon.wait_for_log('sendrawtx exit 0') @@ -1708,6 +1708,26 @@ class LightningDTests(BaseLightningDTests): l1.daemon.wait_for_log('-> ONCHAIND_OUR_UNILATERAL') l2.daemon.wait_for_log('-> ONCHAIND_THEIR_UNILATERAL') + # L1 will timeout HTLC immediately + l1.daemon.wait_for_logs(['Propose handling OUR_UNILATERAL/OUR_HTLC by OUR_HTLC_TIMEOUT_TX .* in 0 blocks', + 'Propose handling OUR_UNILATERAL/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks']) + + l1.daemon.wait_for_log('sendrawtx exit 0') + bitcoind.generate_block(1) + + l1.daemon.wait_for_log('Propose handling OUR_HTLC_TIMEOUT_TX/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks') + bitcoind.generate_block(5) + # It should now claim both the to-local and htlc-timeout-tx outputs. + l1.daemon.wait_for_logs(['Broadcasting OUR_DELAYED_RETURN_TO_WALLET', + 'Broadcasting OUR_DELAYED_RETURN_TO_WALLET', + 'sendrawtx exit 0', + 'sendrawtx exit 0']) + + # Now, 100 blocks it should be done. + bitcoind.generate_block(100) + l1.daemon.wait_for_log('onchaind complete, forgetting peer') + l2.daemon.wait_for_log('onchaind complete, forgetting peer') + @unittest.skipIf(not DEVELOPER, "needs DEVELOPER=1") def test_htlc_in_timeout(self): """Test that we drop onchain if the peer doesn't accept fulfilled HTLC""" @@ -1734,13 +1754,13 @@ class LightningDTests(BaseLightningDTests): payfuture = self.executor.submit(l1.rpc.pay, inv) - # l1 will drop to chain, not reconnect. + # l1 will disonnect and not reconnect. l1.daemon.wait_for_log('dev_disconnect: -WIRE_REVOKE_AND_ACK') # Deadline HTLC expiry minus 1/2 cltv-expiry delta (rounded up) (== cltv - 3). ctlv is 5+1. bitcoind.generate_block(2) assert not l2.daemon.is_in_log('hit deadline') - bitcoind.generate_block(2) + bitcoind.generate_block(1) l2.daemon.wait_for_log('Fulfilled HTLC 0 SENT_REMOVE_COMMIT cltv .* hit deadline') l2.daemon.wait_for_log('sendrawtx exit 0') @@ -1748,6 +1768,20 @@ class LightningDTests(BaseLightningDTests): l2.daemon.wait_for_log('-> ONCHAIND_OUR_UNILATERAL') l1.daemon.wait_for_log('-> ONCHAIND_THEIR_UNILATERAL') + # L2 will collect HTLC + l2.daemon.wait_for_log('Propose handling OUR_UNILATERAL/THEIR_HTLC by OUR_HTLC_SUCCESS_TX .* in 0 blocks') + l2.daemon.wait_for_log('sendrawtx exit 0') + bitcoind.generate_block(1) + l2.daemon.wait_for_log('Propose handling OUR_HTLC_SUCCESS_TX/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks') + bitcoind.generate_block(5) + l2.daemon.wait_for_log('Broadcasting OUR_DELAYED_RETURN_TO_WALLET') + l2.daemon.wait_for_log('sendrawtx exit 0') + + # Now, 100 blocks it should be both done. + bitcoind.generate_block(100) + l1.daemon.wait_for_log('onchaind complete, forgetting peer') + l2.daemon.wait_for_log('onchaind complete, forgetting peer') + @unittest.skipIf(not DEVELOPER, "needs DEVELOPER=1") def test_disconnect(self): # These should all make us fail, and retry.