Changeset View
Changeset View
Standalone View
Standalone View
test/functional/feature_addrman.py
Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | with open(peers_dat, "wb") as f: | ||||
f.write(serialize_addrman(**kwargs)) | f.write(serialize_addrman(**kwargs)) | ||||
class AddrmanTest(BitcoinTestFramework): | class AddrmanTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
def run_test(self): | def run_test(self): | ||||
peers_dat = os.path.join( | peers_dat = os.path.join(self.nodes[0].datadir, self.chain, "peers.dat") | ||||
self.nodes[0].datadir, | |||||
self.chain, | def init_error(reason): | ||||
"peers.dat") | return ( | ||||
f"Error: Invalid or corrupt peers.dat \\({reason}\\). If you believe" | |||||
def init_error(reason): return ( | " this is a bug, please report it to" | ||||
f"Error: Invalid or corrupt peers.dat \\({reason}\\). If you believe this " | f" {self.config['environment']['PACKAGE_BUGREPORT']}. As a workaround," | ||||
f"is a bug, please report it to {self.config['environment']['PACKAGE_BUGREPORT']}. " | f' you can move the file \\("{peers_dat}"\\) out of the way' | ||||
f'As a workaround, you can move the file \\("{peers_dat}"\\) out of the way \\(rename, ' | " \\(rename, move, or delete\\) to have a new one created on the next" | ||||
"move, or delete\\) to have a new one created on the next start." | " start." | ||||
) | ) | ||||
self.log.info("Check that mocked addrman is valid") | self.log.info("Check that mocked addrman is valid") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat) | write_addrman(peers_dat) | ||||
with self.nodes[0].assert_debug_log(["Loaded 0 addresses from peers.dat"]): | with self.nodes[0].assert_debug_log(["Loaded 0 addresses from peers.dat"]): | ||||
self.start_node(0, extra_args=["-checkaddrman=1"]) | self.start_node(0, extra_args=["-checkaddrman=1"]) | ||||
assert_equal(self.nodes[0].getnodeaddresses(), []) | assert_equal(self.nodes[0].getnodeaddresses(), []) | ||||
self.log.info( | self.log.info( | ||||
"Check that addrman with negative lowest_compatible cannot be read") | "Check that addrman with negative lowest_compatible cannot be read" | ||||
) | |||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat, lowest_compatible=-32) | write_addrman(peers_dat, lowest_compatible=-32) | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg=init_error( | expected_msg=init_error( | ||||
"Corrupted addrman database: The compat value \\(0\\) is lower " | "Corrupted addrman database: The compat value \\(0\\) is lower " | ||||
"than the expected minimum value 32.: (.+)" | "than the expected minimum value 32.: (.+)" | ||||
), | ), | ||||
match=ErrorMatch.FULL_REGEX, | match=ErrorMatch.FULL_REGEX, | ||||
) | ) | ||||
self.log.info( | self.log.info("Check that addrman from future is overwritten with new addrman") | ||||
"Check that addrman from future is overwritten with new addrman") | |||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat, lowest_compatible=111) | write_addrman(peers_dat, lowest_compatible=111) | ||||
assert_equal(os.path.exists(f"{peers_dat}.bak"), False) | assert_equal(os.path.exists(f"{peers_dat}.bak"), False) | ||||
with self.nodes[0].assert_debug_log([ | with self.nodes[0].assert_debug_log( | ||||
f'Creating new peers.dat because the file version was not compatible ("{peers_dat}"). Original backed up to peers.dat.bak', | [ | ||||
]): | ( | ||||
"Creating new peers.dat because the file version was not" | |||||
f' compatible ("{peers_dat}"). Original backed up to peers.dat.bak' | |||||
), | |||||
] | |||||
): | |||||
self.start_node(0) | self.start_node(0) | ||||
assert_equal(self.nodes[0].getnodeaddresses(), []) | assert_equal(self.nodes[0].getnodeaddresses(), []) | ||||
assert_equal(os.path.exists(f"{peers_dat}.bak"), True) | assert_equal(os.path.exists(f"{peers_dat}.bak"), True) | ||||
self.log.info("Check that corrupt addrman cannot be read (EOF)") | 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]) | ||||
Show All 18 Lines | def run_test(self): | ||||
match=ErrorMatch.FULL_REGEX, | match=ErrorMatch.FULL_REGEX, | ||||
) | ) | ||||
self.log.info("Check that corrupt addrman cannot be read (len_tried)") | self.log.info("Check that corrupt addrman cannot be read (len_tried)") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat, len_tried=-1) | write_addrman(peers_dat, len_tried=-1) | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg=init_error( | expected_msg=init_error( | ||||
"Corrupt AddrMan serialization: nTried=-1, should be in \\[0, 16384\\]:.*"), | "Corrupt AddrMan serialization: nTried=-1, should be in \\[0," | ||||
" 16384\\]:.*" | |||||
), | |||||
match=ErrorMatch.FULL_REGEX, | match=ErrorMatch.FULL_REGEX, | ||||
) | ) | ||||
self.log.info("Check that corrupt addrman cannot be read (len_new)") | self.log.info("Check that corrupt addrman cannot be read (len_new)") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat, len_new=-1) | write_addrman(peers_dat, len_new=-1) | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg=init_error( | expected_msg=init_error( | ||||
"Corrupt AddrMan serialization: nNew=-1, should be in \\[0, 65536\\]:.*"), | "Corrupt AddrMan serialization: nNew=-1, should be in \\[0, 65536\\]:.*" | ||||
), | |||||
match=ErrorMatch.FULL_REGEX, | match=ErrorMatch.FULL_REGEX, | ||||
) | ) | ||||
self.log.info( | self.log.info("Check that corrupt addrman cannot be read (failed check)") | ||||
"Check that corrupt addrman cannot be read (failed check)") | |||||
self.stop_node(0) | self.stop_node(0) | ||||
write_addrman(peers_dat, bucket_key=0) | write_addrman(peers_dat, bucket_key=0) | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg=init_error( | expected_msg=init_error( | ||||
"Corrupt data. Consistency check failed with code -16: .*"), | "Corrupt data. Consistency check failed with code -16: .*" | ||||
), | |||||
match=ErrorMatch.FULL_REGEX, | 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) | ||||
with self.nodes[0].assert_debug_log([ | with self.nodes[0].assert_debug_log( | ||||
[ | |||||
f'Creating peers.dat because the file was not found ("{peers_dat}")', | f'Creating peers.dat because the file was not found ("{peers_dat}")', | ||||
]): | ] | ||||
): | |||||
self.start_node(0) | self.start_node(0) | ||||
assert_equal(self.nodes[0].getnodeaddresses(), []) | assert_equal(self.nodes[0].getnodeaddresses(), []) | ||||
if __name__ == "__main__": | if __name__ == "__main__": | ||||
AddrmanTest().main() | AddrmanTest().main() |