test: fix feature_init.py file perturbation

Simultaneously opening the file in read and write mode would
lead to opening of an empty file instead of perturbing the existing
file.
Also, revert to the previous state after each perturbation so that
each perturbation is applied in isolation.
pull/27823/head
Martin Zumsande 1 year ago
parent ad66ca1e47
commit d27b9a2248

@ -5,6 +5,7 @@
"""Stress tests related to node initialization."""
import os
from pathlib import Path
import shutil
from test_framework.test_framework import BitcoinTestFramework, SkipTest
from test_framework.test_node import ErrorMatch
@ -47,7 +48,7 @@ class InitStressTest(BitcoinTestFramework):
def start_expecting_error(err_fragment):
node.assert_start_raises_init_error(
extra_args=['-txindex=1', '-blockfilterindex=1', '-coinstatsindex=1'],
extra_args=['-txindex=1', '-blockfilterindex=1', '-coinstatsindex=1', '-checkblocks=200', '-checklevel=4'],
expected_msg=err_fragment,
match=ErrorMatch.PARTIAL_REGEX,
)
@ -101,9 +102,9 @@ class InitStressTest(BitcoinTestFramework):
}
files_to_perturb = {
'blocks/index/*.ldb': 'Error opening block database.',
'blocks/index/*.ldb': 'Error loading block database.',
'chainstate/*.ldb': 'Error opening block database.',
'blocks/blk*.dat': 'Error opening block database.',
'blocks/blk*.dat': 'Corrupted block database detected.',
}
for file_patt, err_fragment in files_to_delete.items():
@ -124,18 +125,31 @@ class InitStressTest(BitcoinTestFramework):
check_clean_start()
self.stop_node(0)
self.log.info("Test startup errors after perturbing certain essential files")
for file_patt, err_fragment in files_to_perturb.items():
shutil.copytree(node.chain_path / "blocks", node.chain_path / "blocks_bak")
shutil.copytree(node.chain_path / "chainstate", node.chain_path / "chainstate_bak")
target_files = list(node.chain_path.glob(file_patt))
for target_file in target_files:
self.log.info(f"Perturbing file to ensure failure {target_file}")
with open(target_file, "rb") as tf_read, open(target_file, "wb") as tf_write:
with open(target_file, "rb") as tf_read:
contents = tf_read.read()
tweaked_contents = bytearray(contents)
tweaked_contents[50:250] = b'1' * 200
# Since the genesis block is not checked by -checkblocks, the
# perturbation window must be chosen such that a higher block
# in blk*.dat is affected.
tweaked_contents[150:350] = b'1' * 200
with open(target_file, "wb") as tf_write:
tf_write.write(bytes(tweaked_contents))
start_expecting_error(err_fragment)
shutil.rmtree(node.chain_path / "blocks")
shutil.rmtree(node.chain_path / "chainstate")
shutil.move(node.chain_path / "blocks_bak", node.chain_path / "blocks")
shutil.move(node.chain_path / "chainstate_bak", node.chain_path / "chainstate")
if __name__ == '__main__':
InitStressTest().main()

Loading…
Cancel
Save