mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-12 18:01:57 +02:00
test: Add addrman deserialization error tests
This commit is contained in:
parent
226731ac11
commit
faa81f9486
@ -14,22 +14,30 @@ from test_framework.test_node import ErrorMatch
|
|||||||
from test_framework.util import assert_equal
|
from test_framework.util import assert_equal
|
||||||
|
|
||||||
|
|
||||||
def serialize_addrman(*, format=1, lowest_compatible=3):
|
def serialize_addrman(
|
||||||
|
*,
|
||||||
|
format=1,
|
||||||
|
lowest_compatible=3,
|
||||||
|
net_magic="regtest",
|
||||||
|
len_new=None,
|
||||||
|
len_tried=None,
|
||||||
|
mock_checksum=None,
|
||||||
|
):
|
||||||
new = []
|
new = []
|
||||||
tried = []
|
tried = []
|
||||||
INCOMPATIBILITY_BASE = 32
|
INCOMPATIBILITY_BASE = 32
|
||||||
r = MAGIC_BYTES["regtest"]
|
r = MAGIC_BYTES[net_magic]
|
||||||
r += struct.pack("B", format)
|
r += struct.pack("B", format)
|
||||||
r += struct.pack("B", INCOMPATIBILITY_BASE + lowest_compatible)
|
r += struct.pack("B", INCOMPATIBILITY_BASE + lowest_compatible)
|
||||||
r += ser_uint256(1)
|
r += ser_uint256(1)
|
||||||
r += struct.pack("i", len(new))
|
r += struct.pack("i", len_new or len(new))
|
||||||
r += struct.pack("i", len(tried))
|
r += struct.pack("i", len_tried or len(tried))
|
||||||
ADDRMAN_NEW_BUCKET_COUNT = 1 << 10
|
ADDRMAN_NEW_BUCKET_COUNT = 1 << 10
|
||||||
r += struct.pack("i", ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30))
|
r += struct.pack("i", ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30))
|
||||||
for _ in range(ADDRMAN_NEW_BUCKET_COUNT):
|
for _ in range(ADDRMAN_NEW_BUCKET_COUNT):
|
||||||
r += struct.pack("i", 0)
|
r += struct.pack("i", 0)
|
||||||
checksum = hash256(r)
|
checksum = hash256(r)
|
||||||
r += checksum
|
r += mock_checksum or checksum
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
@ -70,7 +78,7 @@ class AddrmanTest(BitcoinTestFramework):
|
|||||||
match=ErrorMatch.FULL_REGEX,
|
match=ErrorMatch.FULL_REGEX,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.log.info("Check that corrupt addrman cannot be read")
|
self.log.info("Check that corrupt addrman cannot be read (EOF)")
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
with open(peers_dat, "wb") as f:
|
with open(peers_dat, "wb") as f:
|
||||||
f.write(serialize_addrman()[:-1])
|
f.write(serialize_addrman()[:-1])
|
||||||
@ -79,6 +87,38 @@ class AddrmanTest(BitcoinTestFramework):
|
|||||||
match=ErrorMatch.FULL_REGEX,
|
match=ErrorMatch.FULL_REGEX,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.log.info("Check that corrupt addrman cannot be read (magic)")
|
||||||
|
self.stop_node(0)
|
||||||
|
write_addrman(peers_dat, net_magic="signet")
|
||||||
|
self.nodes[0].assert_start_raises_init_error(
|
||||||
|
expected_msg=init_error("Invalid network magic number"),
|
||||||
|
match=ErrorMatch.FULL_REGEX,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.log.info("Check that corrupt addrman cannot be read (checksum)")
|
||||||
|
self.stop_node(0)
|
||||||
|
write_addrman(peers_dat, mock_checksum=b"ab" * 32)
|
||||||
|
self.nodes[0].assert_start_raises_init_error(
|
||||||
|
expected_msg=init_error("Checksum mismatch, data corrupted"),
|
||||||
|
match=ErrorMatch.FULL_REGEX,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.log.info("Check that corrupt addrman cannot be read (len_tried)")
|
||||||
|
self.stop_node(0)
|
||||||
|
write_addrman(peers_dat, len_tried=-1)
|
||||||
|
self.nodes[0].assert_start_raises_init_error(
|
||||||
|
expected_msg=init_error("Corrupt CAddrMan serialization: nTried=-1, should be in \\[0, 16384\\]:.*"),
|
||||||
|
match=ErrorMatch.FULL_REGEX,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.log.info("Check that corrupt addrman cannot be read (len_new)")
|
||||||
|
self.stop_node(0)
|
||||||
|
write_addrman(peers_dat, len_new=-1)
|
||||||
|
self.nodes[0].assert_start_raises_init_error(
|
||||||
|
expected_msg=init_error("Corrupt CAddrMan serialization: nNew=-1, should be in \\[0, 65536\\]:.*"),
|
||||||
|
match=ErrorMatch.FULL_REGEX,
|
||||||
|
)
|
||||||
|
|
||||||
self.log.info("Check that missing addrman is recreated")
|
self.log.info("Check that missing addrman is recreated")
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
os.remove(peers_dat)
|
os.remove(peers_dat)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user