2019-01-31 16:06:07 -05:00
#!/usr/bin/env python3
2021-07-28 13:57:16 +02:00
# Copyright (c) 2019-2021 The Bitcoin Core developers
2019-01-31 16:06:07 -05:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
""" Test bitcoind aborts if can ' t disconnect a block.
- Start a single node and generate 3 blocks .
- Delete the undo data .
- Mine a fork that requires disconnecting the tip .
- Verify that bitcoind AbortNode ' s.
"""
from test_framework . test_framework import BitcoinTestFramework
2020-03-20 10:48:13 -04:00
class AbortNodeTest ( BitcoinTestFramework ) :
2019-01-31 16:06:07 -05:00
def set_test_params ( self ) :
self . setup_clean_chain = True
self . num_nodes = 2
def setup_network ( self ) :
self . setup_nodes ( )
# We'll connect the nodes later
def run_test ( self ) :
2020-11-10 18:02:31 +01:00
self . generate ( self . nodes [ 0 ] , 3 , sync_fun = self . no_op )
2019-01-31 16:06:07 -05:00
# Deleting the undo file will result in reorg failure
2023-07-12 15:03:38 +02:00
( self . nodes [ 0 ] . blocks_path / " rev00000.dat " ) . unlink ( )
2019-01-31 16:06:07 -05:00
# Connecting to a node with a more work chain will trigger a reorg
# attempt.
2020-11-10 18:02:31 +01:00
self . generate ( self . nodes [ 1 ] , 3 , sync_fun = self . no_op )
2019-01-31 16:06:07 -05:00
with self . nodes [ 0 ] . assert_debug_log ( [ " Failed to disconnect block " ] ) :
2020-09-17 00:46:07 -07:00
self . connect_nodes ( 0 , 1 )
2020-11-10 18:02:31 +01:00
self . generate ( self . nodes [ 1 ] , 1 , sync_fun = self . no_op )
2019-01-31 16:06:07 -05:00
# Check that node0 aborted
self . log . info ( " Waiting for crash " )
2024-03-15 21:42:44 +01:00
self . nodes [ 0 ] . wait_until_stopped ( timeout = 5 , expect_error = True , expected_stderr = " Error: A fatal internal error occurred, see debug.log for details: Failed to disconnect block. " )
2019-01-31 16:06:07 -05:00
self . log . info ( " Node crashed - now verifying restart fails " )
self . nodes [ 0 ] . assert_start_raises_init_error ( )
2020-03-20 10:48:13 -04:00
2019-01-31 16:06:07 -05:00
if __name__ == ' __main__ ' :
2024-07-16 22:05:14 +01:00
AbortNodeTest ( __file__ ) . main ( )