From b4e037ee0132b6d5ae85708b11d3842ba9c13bf1 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Wed, 8 Nov 2017 13:11:12 +0000 Subject: [PATCH] QA/Mininode: Support node-to-test connections --- test/functional/test_framework/p2p.py | 27 ++++++++++++++++++--- test/functional/test_framework/test_node.py | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/test/functional/test_framework/p2p.py b/test/functional/test_framework/p2p.py index be4ed624fc..56fe9126f5 100755 --- a/test/functional/test_framework/p2p.py +++ b/test/functional/test_framework/p2p.py @@ -24,6 +24,7 @@ import asyncio from collections import defaultdict from io import BytesIO import logging +import socket import struct import sys import threading @@ -180,12 +181,32 @@ class P2PConnection(asyncio.Protocol): self.recvbuf = b"" self.magic_bytes = MAGIC_BYTES[net] - def peer_connect(self, dstaddr, dstport, *, net, timeout_factor): + def peer_connect(self, dstaddr, dstport, *, net, timeout_factor, node_outgoing=False): self.peer_connect_helper(dstaddr, dstport, net, timeout_factor) + self.node_outgoing = node_outgoing loop = NetworkThread.network_event_loop - logger.debug('Connecting to Bitcoin Node: %s:%d' % (self.dstaddr, self.dstport)) - coroutine = loop.create_connection(lambda: self, host=self.dstaddr, port=self.dstport) + + if self.node_outgoing: + logger.debug('Connecting from Bitcoin Node: %s:%d' % (self.dstaddr, self.dstport)) + + listen_sock = socket.socket() + listen_sock.bind(('127.0.0.1', 0)) + listen_sock.listen(1) + listen_port = listen_sock.getsockname()[1] + self.rpc.addnode('127.0.0.1:%u' % (listen_port,), 'onetry', 'outbound-full-relay') + (sock, addr) = listen_sock.accept() + assert sock + listen_sock.close() + + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + sock.setblocking(False) + coroutine = loop.create_connection(lambda: self, sock=sock) + else: + logger.debug('Connecting to Bitcoin Node: %s:%d' % (self.dstaddr, self.dstport)) + + coroutine = loop.create_connection(lambda: self, host=self.dstaddr, port=self.dstport) + return lambda: loop.call_soon_threadsafe(loop.create_task, coroutine) def peer_accept_connection(self, connect_id, connect_cb=lambda: None, *, net, timeout_factor): diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index c77cfbdd91..4a5a8e0630 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -644,6 +644,7 @@ class TestNode(): if 'dstaddr' not in kwargs: kwargs['dstaddr'] = '127.0.0.1' + p2p_conn.rpc = self p2p_conn.peer_connect(**kwargs, net=self.chain, timeout_factor=self.timeout_factor)() self.p2ps.append(p2p_conn) p2p_conn.wait_until(lambda: p2p_conn.is_connected, check_connected=False)