diff options
author | fanquake <fanquake@gmail.com> | 2023-05-05 13:58:29 +0100 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2023-05-05 14:13:03 +0100 |
commit | b11bd045e4f1dadab1c8bdd422bb5f2ebf588e56 (patch) | |
tree | 0fc7658f4f32b0eb8356623c4ad356fb8e030596 | |
parent | 6c7ebcc14b7908a67a8f8764b398e76c8fb4fe8b (diff) | |
parent | c371cae07a7ba045130568b6abc470eaa4f95ef4 (diff) | |
download | bitcoin-b11bd045e4f1dadab1c8bdd422bb5f2ebf588e56.tar.xz |
Merge bitcoin/bitcoin#26653: test, init: perturb file to ensure failure instead of only deleting them
c371cae07a7ba045130568b6abc470eaa4f95ef4 test, init: perturb file to ensure failure instead of only deleting them (brunoerg)
Pull request description:
In `feature_init.py` there is a TODO about perturbing the files instead of only testing by deleting them.
```py
# TODO: at some point, we should test perturbing the files instead of removing
# them, e.g.
#
# contents = target_file.read_bytes()
# tweaked_contents = bytearray(contents)
# tweaked_contents[50:250] = b'1' * 200
# target_file.write_bytes(bytes(tweaked_contents))
#
# At the moment I can't get this to work (bitcoind loads successfully?) so
# investigate doing this later.
```
This PR adds it by writing into the file random bytes and checking whether it throws an error when starting.
ACKs for top commit:
MarcoFalke:
lgtm ACK c371cae07a7ba045130568b6abc470eaa4f95ef4
Tree-SHA512: d691eee60b91dd9d1b200588608f56b0a10dccd9761a75254b69e0ba5e5866cae14d2f90cb2bd7ec0f95b0617c2562cd33f20892ffd16355b6df770d3806a0ff
-rwxr-xr-x | test/functional/feature_init.py | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/test/functional/feature_init.py b/test/functional/feature_init.py index 70a802dc58..7af67730bd 100755 --- a/test/functional/feature_init.py +++ b/test/functional/feature_init.py @@ -45,6 +45,13 @@ class InitStressTest(BitcoinTestFramework): node.process.terminate() node.process.wait() + def start_expecting_error(err_fragment): + node.assert_start_raises_init_error( + extra_args=['-txindex=1', '-blockfilterindex=1', '-coinstatsindex=1'], + expected_msg=err_fragment, + match=ErrorMatch.PARTIAL_REGEX, + ) + def check_clean_start(): """Ensure that node restarts successfully after various interrupts.""" node.start() @@ -87,36 +94,27 @@ class InitStressTest(BitcoinTestFramework): self.log.info("Test startup errors after removing certain essential files") - files_to_disturb = { + files_to_delete = { 'blocks/index/*.ldb': 'Error opening block database.', 'chainstate/*.ldb': 'Error opening block database.', 'blocks/blk*.dat': 'Error loading block database.', } - for file_patt, err_fragment in files_to_disturb.items(): + files_to_perturb = { + 'blocks/index/*.ldb': 'Error opening block database.', + 'chainstate/*.ldb': 'Error opening block database.', + 'blocks/blk*.dat': 'Error opening block database.', + } + + for file_patt, err_fragment in files_to_delete.items(): target_files = list(node.chain_path.glob(file_patt)) for target_file in target_files: - self.log.info(f"Tweaking file to ensure failure {target_file}") + self.log.info(f"Deleting file to ensure failure {target_file}") bak_path = str(target_file) + ".bak" target_file.rename(bak_path) - # TODO: at some point, we should test perturbing the files instead of removing - # them, e.g. - # - # contents = target_file.read_bytes() - # tweaked_contents = bytearray(contents) - # tweaked_contents[50:250] = b'1' * 200 - # target_file.write_bytes(bytes(tweaked_contents)) - # - # At the moment I can't get this to work (bitcoind loads successfully?) so - # investigate doing this later. - - node.assert_start_raises_init_error( - extra_args=['-txindex=1', '-blockfilterindex=1', '-coinstatsindex=1'], - expected_msg=err_fragment, - match=ErrorMatch.PARTIAL_REGEX, - ) + start_expecting_error(err_fragment) for target_file in target_files: bak_path = str(target_file) + ".bak" @@ -126,6 +124,18 @@ class InitStressTest(BitcoinTestFramework): check_clean_start() self.stop_node(0) + for file_patt, err_fragment in files_to_perturb.items(): + 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: + contents = tf_read.read() + tweaked_contents = bytearray(contents) + tweaked_contents[50:250] = b'1' * 200 + tf_write.write(bytes(tweaked_contents)) + + start_expecting_error(err_fragment) if __name__ == '__main__': InitStressTest().main() |