diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py index d901b7bcf96..9839993115a 100755 --- a/test/functional/feature_addrman.py +++ b/test/functional/feature_addrman.py @@ -9,12 +9,12 @@ import struct from test_framework.messages import ser_uint256, hash256 +from test_framework.netutil import ADDRMAN_NEW_BUCKET_COUNT, ADDRMAN_TRIED_BUCKET_COUNT, ADDRMAN_BUCKET_SIZE from test_framework.p2p import MAGIC_BYTES from test_framework.test_framework import BitcoinTestFramework from test_framework.test_node import ErrorMatch from test_framework.util import assert_equal - def serialize_addrman( *, format=1, @@ -117,17 +117,34 @@ def run_test(self): self.log.info("Check that corrupt addrman cannot be read (len_tried)") self.stop_node(0) + max_len_tried = ADDRMAN_TRIED_BUCKET_COUNT * ADDRMAN_BUCKET_SIZE write_addrman(peers_dat, len_tried=-1) self.nodes[0].assert_start_raises_init_error( - expected_msg=init_error("Corrupt AddrMan serialization: nTried=-1, should be in \\[0, 16384\\]:.*"), + expected_msg=init_error(f"Corrupt AddrMan serialization: nTried=-1, should be in \\[0, {max_len_tried}\\]:.*"), + match=ErrorMatch.FULL_REGEX, + ) + + self.log.info("Check that corrupt addrman cannot be read (large len_tried)") + write_addrman(peers_dat, len_tried=max_len_tried + 1) + self.nodes[0].assert_start_raises_init_error( + expected_msg=init_error(f"Corrupt AddrMan serialization: nTried={max_len_tried + 1}, should be in \\[0, {max_len_tried}\\]:.*"), match=ErrorMatch.FULL_REGEX, ) self.log.info("Check that corrupt addrman cannot be read (len_new)") self.stop_node(0) + max_len_new = ADDRMAN_NEW_BUCKET_COUNT * ADDRMAN_BUCKET_SIZE write_addrman(peers_dat, len_new=-1) self.nodes[0].assert_start_raises_init_error( - expected_msg=init_error("Corrupt AddrMan serialization: nNew=-1, should be in \\[0, 65536\\]:.*"), + expected_msg=init_error(f"Corrupt AddrMan serialization: nNew=-1, should be in \\[0, {max_len_new}\\]:.*"), + match=ErrorMatch.FULL_REGEX, + ) + + self.log.info("Check that corrupt addrman cannot be read (large len_new)") + self.stop_node(0) + write_addrman(peers_dat, len_new=max_len_new + 1) + self.nodes[0].assert_start_raises_init_error( + expected_msg=init_error(f"Corrupt AddrMan serialization: nNew={max_len_new + 1}, should be in \\[0, {max_len_new}\\]:.*"), match=ErrorMatch.FULL_REGEX, ) diff --git a/test/functional/test_framework/netutil.py b/test/functional/test_framework/netutil.py index fcea4b2f680..838f40fcaaa 100644 --- a/test/functional/test_framework/netutil.py +++ b/test/functional/test_framework/netutil.py @@ -25,6 +25,11 @@ STATE_LISTEN = '0A' # STATE_CLOSING = '0B' +# Address manager size constants as defined in addrman_impl.h +ADDRMAN_NEW_BUCKET_COUNT = 1 << 10 +ADDRMAN_TRIED_BUCKET_COUNT = 1 << 8 +ADDRMAN_BUCKET_SIZE = 1 << 6 + def get_socket_inodes(pid): ''' Get list of socket inodes for process pid.