Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_addrv2_relay.py
- This file was copied from test/functional/p2p_addr_relay.py.
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2020 The Bitcoin Core developers | # Copyright (c) 2020 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
""" | """ | ||||
Test addr relay | Test addrv2 relay | ||||
""" | """ | ||||
import time | |||||
from test_framework.messages import ( | from test_framework.messages import ( | ||||
CAddress, | CAddress, | ||||
msg_addrv2, | |||||
NODE_NETWORK, | NODE_NETWORK, | ||||
msg_addr, | |||||
) | |||||
from test_framework.mininode import ( | |||||
P2PInterface, | |||||
) | ) | ||||
from test_framework.mininode import P2PInterface | |||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import assert_equal | ||||
assert_equal, | |||||
) | |||||
import time | |||||
ADDRS = [] | ADDRS = [] | ||||
for i in range(10): | for i in range(10): | ||||
addr = CAddress() | addr = CAddress() | ||||
addr.time = int(time.time()) + i | addr.time = int(time.time()) + i | ||||
addr.nServices = NODE_NETWORK | addr.nServices = NODE_NETWORK | ||||
addr.ip = "123.123.123.{}".format(i % 256) | addr.ip = "123.123.123.{}".format(i % 256) | ||||
addr.port = 8333 + i | addr.port = 8333 + i | ||||
ADDRS.append(addr) | ADDRS.append(addr) | ||||
class AddrReceiver(P2PInterface): | class AddrReceiver(P2PInterface): | ||||
def on_addr(self, message): | addrv2_received_and_checked = False | ||||
def __init__(self): | |||||
super().__init__(support_addrv2=True) | |||||
def on_addrv2(self, message): | |||||
for addr in message.addrs: | for addr in message.addrs: | ||||
assert_equal(addr.nServices, NODE_NETWORK) | assert_equal(addr.nServices, NODE_NETWORK) | ||||
assert addr.ip.startswith('123.123.123.') | assert addr.ip.startswith('123.123.123.') | ||||
assert (8333 <= addr.port < 8343) | assert (8333 <= addr.port < 8343) | ||||
self.addrv2_received_and_checked = True | |||||
def wait_for_addrv2(self): | |||||
self.wait_until(lambda: "addrv2" in self.last_message) | |||||
class AddrTest(BitcoinTestFramework): | class AddrTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = False | self.setup_clean_chain = True | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
def run_test(self): | def run_test(self): | ||||
self.log.info('Create connection that sends addr messages') | self.log.info('Create connection that sends addrv2 messages') | ||||
addr_source = self.nodes[0].add_p2p_connection(P2PInterface()) | addr_source = self.nodes[0].add_p2p_connection(P2PInterface()) | ||||
msg = msg_addr() | msg = msg_addrv2() | ||||
self.log.info('Send too large addr message') | self.log.info('Send too-large addrv2 message') | ||||
msg.addrs = ADDRS * 101 | msg.addrs = ADDRS * 101 | ||||
with self.nodes[0].assert_debug_log(['message addr size() = 1010']): | with self.nodes[0].assert_debug_log(['addrv2 message size = 1010']): | ||||
addr_source.send_and_ping(msg) | addr_source.send_and_ping(msg) | ||||
self.log.info( | self.log.info( | ||||
'Check that addr message content is relayed and added to addrman') | 'Check that addrv2 message content is relayed and added to addrman') | ||||
addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) | ||||
msg.addrs = ADDRS | msg.addrs = ADDRS | ||||
with self.nodes[0].assert_debug_log([ | with self.nodes[0].assert_debug_log([ | ||||
'Added 10 addresses from 127.0.0.1: 0 tried', | 'Added 10 addresses from 127.0.0.1: 0 tried', | ||||
'received: addr (301 bytes) peer=0', | 'received: addrv2 (131 bytes) peer=0', | ||||
'sending addr (301 bytes) peer=1', | 'sending addrv2 (131 bytes) peer=1', | ||||
]): | ]): | ||||
addr_source.send_and_ping(msg) | addr_source.send_and_ping(msg) | ||||
self.nodes[0].setmocktime(int(time.time()) + 30 * 60) | self.nodes[0].setmocktime(int(time.time()) + 30 * 60) | ||||
addr_receiver.sync_with_ping() | addr_receiver.wait_for_addrv2() | ||||
assert addr_receiver.addrv2_received_and_checked | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
AddrTest().main() | AddrTest().main() |