mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
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.
This commit is contained in:
parent
ad66ca1e47
commit
d27b9a2248
1 changed files with 19 additions and 5 deletions
|
@ -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…
Add table
Reference in a new issue