@ -11,7 +11,8 @@ from test_framework.messages import (
NODE_NETWORK ,
NODE_NETWORK ,
NODE_WITNESS ,
NODE_WITNESS ,
msg_addr ,
msg_addr ,
msg_getaddr
msg_getaddr ,
msg_verack
)
)
from test_framework . p2p import (
from test_framework . p2p import (
P2PInterface ,
P2PInterface ,
@ -27,10 +28,12 @@ class AddrReceiver(P2PInterface):
num_ipv4_received = 0
num_ipv4_received = 0
test_addr_contents = False
test_addr_contents = False
_tokens = 1
_tokens = 1
send_getaddr = True
def __init__ ( self , test_addr_contents = False ):
def __init__ ( self , test_addr_contents = False , send_getaddr = True ):
super ( ) . __init__ ( )
super ( ) . __init__ ( )
self . test_addr_contents = test_addr_contents
self . test_addr_contents = test_addr_contents
self . send_getaddr = send_getaddr
def on_addr ( self , message ) :
def on_addr ( self , message ) :
for addr in message . addrs :
for addr in message . addrs :
@ -60,6 +63,11 @@ class AddrReceiver(P2PInterface):
def addr_received ( self ) :
def addr_received ( self ) :
return self . num_ipv4_received != 0
return self . num_ipv4_received != 0
def on_version ( self , message ) :
self . send_message ( msg_verack ( ) )
if ( self . send_getaddr ) :
self . send_message ( msg_getaddr ( ) )
def getaddr_received ( self ) :
def getaddr_received ( self ) :
return self . message_count [ ' getaddr ' ] > 0
return self . message_count [ ' getaddr ' ] > 0
@ -156,7 +164,7 @@ class AddrTest(BitcoinTestFramework):
self . nodes [ 0 ] . disconnect_p2ps ( )
self . nodes [ 0 ] . disconnect_p2ps ( )
self . log . info ( ' Check relay of addresses received from outbound peers ' )
self . log . info ( ' Check relay of addresses received from outbound peers ' )
inbound_peer = self . nodes [ 0 ] . add_p2p_connection ( AddrReceiver ( test_addr_contents = True ))
inbound_peer = self . nodes [ 0 ] . add_p2p_connection ( AddrReceiver ( test_addr_contents = True , send_getaddr = False ))
full_outbound_peer = self . nodes [ 0 ] . add_outbound_p2p_connection ( AddrReceiver ( ) , p2p_idx = 0 , connection_type = " outbound-full-relay " )
full_outbound_peer = self . nodes [ 0 ] . add_outbound_p2p_connection ( AddrReceiver ( ) , p2p_idx = 0 , connection_type = " outbound-full-relay " )
msg = self . setup_addr_msg ( 2 )
msg = self . setup_addr_msg ( 2 )
self . send_addr_msg ( full_outbound_peer , msg , [ inbound_peer ] )
self . send_addr_msg ( full_outbound_peer , msg , [ inbound_peer ] )
@ -185,6 +193,12 @@ class AddrTest(BitcoinTestFramework):
self . nodes [ 0 ] . disconnect_p2ps ( )
self . nodes [ 0 ] . disconnect_p2ps ( )
def getaddr_tests ( self ) :
def getaddr_tests ( self ) :
# In the previous tests, the node answered GETADDR requests with an
# empty addrman. Due to GETADDR response caching (see
# CConnman::GetAddresses), the node would continue to provide 0 addrs
# in response until enough time has passed or the node is restarted.
self . restart_node ( 0 )
self . log . info ( ' Test getaddr behavior ' )
self . log . info ( ' Test getaddr behavior ' )
self . log . info ( ' Check that we send a getaddr message upon connecting to an outbound-full-relay peer ' )
self . log . info ( ' Check that we send a getaddr message upon connecting to an outbound-full-relay peer ' )
full_outbound_peer = self . nodes [ 0 ] . add_outbound_p2p_connection ( AddrReceiver ( ) , p2p_idx = 0 , connection_type = " outbound-full-relay " )
full_outbound_peer = self . nodes [ 0 ] . add_outbound_p2p_connection ( AddrReceiver ( ) , p2p_idx = 0 , connection_type = " outbound-full-relay " )
@ -197,7 +211,7 @@ class AddrTest(BitcoinTestFramework):
assert_equal ( block_relay_peer . getaddr_received ( ) , False )
assert_equal ( block_relay_peer . getaddr_received ( ) , False )
self . log . info ( ' Check that we answer getaddr messages only from inbound peers ' )
self . log . info ( ' Check that we answer getaddr messages only from inbound peers ' )
inbound_peer = self . nodes [ 0 ] . add_p2p_connection ( AddrReceiver ( ) )
inbound_peer = self . nodes [ 0 ] . add_p2p_connection ( AddrReceiver ( send_getaddr = False ) )
inbound_peer . sync_with_ping ( )
inbound_peer . sync_with_ping ( )
# Add some addresses to addrman
# Add some addresses to addrman