aboutsummaryrefslogtreecommitdiff
path: root/test/functional/feature_abortnode.py
diff options
context:
space:
mode:
authorSuhas Daftuar <sdaftuar@gmail.com>2019-01-31 16:06:07 -0500
committerSuhas Daftuar <sdaftuar@gmail.com>2019-06-05 05:05:49 -0400
commita47df13471e3168e2e02023fb20cdf2414141b36 (patch)
treecbffdfc1b112d92fa1abb83f0e4082f171007bfa /test/functional/feature_abortnode.py
parent4433ed0f730cfd60eeba3694ff3c283ce2c0c8ee (diff)
[qa] Test disconnect block failure -> shutdown
Diffstat (limited to 'test/functional/feature_abortnode.py')
-rwxr-xr-xtest/functional/feature_abortnode.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/test/functional/feature_abortnode.py b/test/functional/feature_abortnode.py
new file mode 100755
index 0000000000..62c3eca07d
--- /dev/null
+++ b/test/functional/feature_abortnode.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+# Copyright (c) 2019 The Bitcoin Core developers
+# 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
+from test_framework.util import wait_until, get_datadir_path, connect_nodes
+import os
+
+class AbortNodeTest(BitcoinTestFramework):
+
+ 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):
+ self.nodes[0].generate(3)
+ datadir = get_datadir_path(self.options.tmpdir, 0)
+
+ # Deleting the undo file will result in reorg failure
+ os.unlink(os.path.join(datadir, 'regtest', 'blocks', 'rev00000.dat'))
+
+ # Connecting to a node with a more work chain will trigger a reorg
+ # attempt.
+ self.nodes[1].generate(3)
+ with self.nodes[0].assert_debug_log(["Failed to disconnect block"]):
+ connect_nodes(self.nodes[0], 1)
+ self.nodes[1].generate(1)
+
+ # Check that node0 aborted
+ self.log.info("Waiting for crash")
+ wait_until(lambda: self.nodes[0].is_node_stopped(), timeout=60)
+ self.log.info("Node crashed - now verifying restart fails")
+ self.nodes[0].assert_start_raises_init_error()
+
+if __name__ == '__main__':
+ AbortNodeTest().main()