Skip to content

Commit

Permalink
test: add test for interaction with -blocksonly peers
Browse files Browse the repository at this point in the history
  • Loading branch information
mzumsande committed Sep 26, 2023
1 parent 6fa1a21 commit 32f044d
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 6 deletions.
32 changes: 30 additions & 2 deletions test/functional/p2p_blocksonly.py
Expand Up @@ -6,8 +6,14 @@

import time

from test_framework.messages import msg_tx, msg_inv, CInv, MSG_WTX
from test_framework.p2p import P2PInterface, P2PTxInvStore
from test_framework.messages import msg_tx, msg_inv, msg_version, CInv, MSG_WTX
from test_framework.p2p import (
P2PInterface,
P2PTxInvStore,
P2P_SERVICES,
P2P_SUBVERSION,
P2P_VERSION,
)
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal
from test_framework.wallet import MiniWallet
Expand Down Expand Up @@ -78,6 +84,28 @@ def blocksonly_mode_tests(self):
self.nodes[0].disconnect_p2ps()
self.generate(self.nodes[0], 1)

no_txrelay_version_msg = msg_version()
no_txrelay_version_msg.nVersion = P2P_VERSION
no_txrelay_version_msg.strSubVer = P2P_SUBVERSION
no_txrelay_version_msg.nServices = P2P_SERVICES
no_txrelay_version_msg.relay = 0
self.log.info("Check that we can make full-relay outbound connections to -blocksonly peers if we are -blockonly ourselves")
blocksonly_peer = self.nodes[0].add_outbound_p2p_connection(P2PInterface(), p2p_idx=1, send_version=False, wait_for_verack=False)
blocksonly_peer.send_message(no_txrelay_version_msg)
blocksonly_peer.wait_for_verack()

self.log.info("Check that we don't make full-relay outbound connections to -blocksonly peers if we support tx relay")
self.restart_node(0, [])
blocksonly_peer = self.nodes[0].add_outbound_p2p_connection(P2PInterface(), p2p_idx=2, send_version=False, wait_for_verack=False)
blocksonly_peer.send_message(no_txrelay_version_msg)
blocksonly_peer.wait_for_disconnect()

self.log.info("Check that we do sustain block-relay-only connections to -blocksonly peers")
self.restart_node(0, [])
blocksonly_peer = self.nodes[0].add_outbound_p2p_connection(P2PInterface(), p2p_idx=3, connection_type="block-relay-only", send_version=False, wait_for_verack=False)
blocksonly_peer.send_message(no_txrelay_version_msg)
blocksonly_peer.wait_for_verack()

def blocks_relay_conn_tests(self):
self.log.info('Tests with node in normal mode with block-relay-only connections')
self.restart_node(0, ["-noblocksonly"]) # disables blocks only mode
Expand Down
5 changes: 3 additions & 2 deletions test/functional/test_framework/p2p.py
Expand Up @@ -372,9 +372,10 @@ def peer_connect(self, *args, services=P2P_SERVICES, send_version=True, **kwargs

return create_conn

def peer_accept_connection(self, *args, services=P2P_SERVICES, **kwargs):
def peer_accept_connection(self, *args, services=P2P_SERVICES, send_version=True, **kwargs):
create_conn = super().peer_accept_connection(*args, **kwargs)
self.peer_connect_send_version(services)
if send_version:
self.peer_connect_send_version(services)

return create_conn

Expand Down
4 changes: 2 additions & 2 deletions test/functional/test_framework/test_node.py
Expand Up @@ -670,7 +670,7 @@ def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, **kwargs):

return p2p_conn

def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, p2p_idx, connection_type="outbound-full-relay", **kwargs):
def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, send_version=True, p2p_idx, connection_type="outbound-full-relay", **kwargs):
"""Add an outbound p2p connection from node. Must be an
"outbound-full-relay", "block-relay-only", "addr-fetch" or "feeler" connection.
Expand All @@ -686,7 +686,7 @@ def addconnection_callback(address, port):
self.log.debug("Connecting to %s:%d %s" % (address, port, connection_type))
self.addconnection('%s:%d' % (address, port), connection_type)

p2p_conn.peer_accept_connection(connect_cb=addconnection_callback, connect_id=p2p_idx + 1, net=self.chain, timeout_factor=self.timeout_factor, **kwargs)()
p2p_conn.peer_accept_connection(connect_cb=addconnection_callback, connect_id=p2p_idx + 1, net=self.chain, timeout_factor=self.timeout_factor, send_version=send_version, **kwargs)()

if connection_type == "feeler":
# feeler connections are closed as soon as the node receives a `version` message
Expand Down

0 comments on commit 32f044d

Please sign in to comment.