Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_getaddr_caching.py
Show All 11 Lines | |||||
from test_framework.util import assert_equal | from test_framework.util import assert_equal | ||||
# As defined in net_processing. | # As defined in net_processing. | ||||
MAX_ADDR_TO_SEND = 1000 | MAX_ADDR_TO_SEND = 1000 | ||||
MAX_PCT_ADDR_TO_SEND = 23 | MAX_PCT_ADDR_TO_SEND = 23 | ||||
class AddrReceiver(P2PInterface): | class AddrReceiver(P2PInterface): | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
self.received_addrs = None | self.received_addrs = None | ||||
def get_received_addrs(self): | def get_received_addrs(self): | ||||
with p2p_lock: | with p2p_lock: | ||||
return self.received_addrs | return self.received_addrs | ||||
Show All 9 Lines | |||||
class AddrTest(BitcoinTestFramework): | class AddrTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
# TODO When Backporting core#25096, please also includes changes from: | # TODO When Backporting core#25096, please also includes changes from: | ||||
# - core#25312 | # - core#25312 | ||||
# - core#25333 | # - core#25333 | ||||
def run_test(self): | def run_test(self): | ||||
self.log.info('Fill peer AddrMan with a lot of records') | self.log.info("Fill peer AddrMan with a lot of records") | ||||
for i in range(10000): | for i in range(10000): | ||||
first_octet = i >> 8 | first_octet = i >> 8 | ||||
second_octet = i % 256 | second_octet = i % 256 | ||||
a = f"{first_octet}.{second_octet}.1.1" | a = f"{first_octet}.{second_octet}.1.1" | ||||
self.nodes[0].addpeeraddress(a, 8333) | self.nodes[0].addpeeraddress(a, 8333) | ||||
# Need to make sure we hit MAX_ADDR_TO_SEND records in the addr | # Need to make sure we hit MAX_ADDR_TO_SEND records in the addr | ||||
# response later because only a fraction of all known addresses | # response later because only a fraction of all known addresses | ||||
# can be cached and returned. | # can be cached and returned. | ||||
assert len(self.nodes[0].getnodeaddresses(0)) > int( | assert len(self.nodes[0].getnodeaddresses(0)) > int( | ||||
MAX_ADDR_TO_SEND / (MAX_PCT_ADDR_TO_SEND / 100)) | MAX_ADDR_TO_SEND / (MAX_PCT_ADDR_TO_SEND / 100) | ||||
) | |||||
responses = [] | responses = [] | ||||
self.log.info('Send many addr requests within short time to receive') | self.log.info("Send many addr requests within short time to receive") | ||||
N = 5 | N = 5 | ||||
cur_mock_time = int(time.time()) | cur_mock_time = int(time.time()) | ||||
for i in range(N): | for i in range(N): | ||||
addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | ||||
addr_receiver.send_and_ping(msg_getaddr()) | addr_receiver.send_and_ping(msg_getaddr()) | ||||
# Trigger response | # Trigger response | ||||
cur_mock_time += 5 * 60 | cur_mock_time += 5 * 60 | ||||
self.nodes[0].setmocktime(cur_mock_time) | self.nodes[0].setmocktime(cur_mock_time) | ||||
addr_receiver.wait_until(addr_receiver.addr_received) | addr_receiver.wait_until(addr_receiver.addr_received) | ||||
responses.append(addr_receiver.get_received_addrs()) | responses.append(addr_receiver.get_received_addrs()) | ||||
for response in responses[1:]: | for response in responses[1:]: | ||||
assert_equal(response, responses[0]) | assert_equal(response, responses[0]) | ||||
assert len(response) == MAX_ADDR_TO_SEND | assert len(response) == MAX_ADDR_TO_SEND | ||||
cur_mock_time += 3 * 24 * 60 * 60 | cur_mock_time += 3 * 24 * 60 * 60 | ||||
self.nodes[0].setmocktime(cur_mock_time) | self.nodes[0].setmocktime(cur_mock_time) | ||||
self.log.info('After time passed, see a new response to addr request') | self.log.info("After time passed, see a new response to addr request") | ||||
last_addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | last_addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | ||||
last_addr_receiver.send_and_ping(msg_getaddr()) | last_addr_receiver.send_and_ping(msg_getaddr()) | ||||
# Trigger response | # Trigger response | ||||
cur_mock_time += 5 * 60 | cur_mock_time += 5 * 60 | ||||
self.nodes[0].setmocktime(cur_mock_time) | self.nodes[0].setmocktime(cur_mock_time) | ||||
last_addr_receiver.wait_until(last_addr_receiver.addr_received) | last_addr_receiver.wait_until(last_addr_receiver.addr_received) | ||||
# new response is different | # new response is different | ||||
assert (set(responses[0]) != set( | assert set(responses[0]) != set(last_addr_receiver.get_received_addrs()) | ||||
last_addr_receiver.get_received_addrs())) | |||||
if __name__ == '__main__': | if __name__ == "__main__": | ||||
AddrTest().main() | AddrTest().main() |