QA/Mininode: Support node-to-test connections

This commit is contained in:
Luke Dashjr 2017-11-08 13:11:12 +00:00
parent 34ff7c53e9
commit 97ec3d2042
2 changed files with 25 additions and 3 deletions

View File

@ -24,6 +24,7 @@ import asyncio
from collections import defaultdict
from io import BytesIO
import logging
import socket
import struct
import sys
import threading
@ -174,12 +175,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):

View File

@ -612,6 +612,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)