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 collections import defaultdict
from io import BytesIO from io import BytesIO
import logging import logging
import socket
import struct import struct
import sys import sys
import threading import threading
@ -174,12 +175,32 @@ class P2PConnection(asyncio.Protocol):
self.recvbuf = b"" self.recvbuf = b""
self.magic_bytes = MAGIC_BYTES[net] 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.peer_connect_helper(dstaddr, dstport, net, timeout_factor)
self.node_outgoing = node_outgoing
loop = NetworkThread.network_event_loop 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) return lambda: loop.call_soon_threadsafe(loop.create_task, coroutine)
def peer_accept_connection(self, connect_id, connect_cb=lambda: None, *, net, timeout_factor): 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: if 'dstaddr' not in kwargs:
kwargs['dstaddr'] = '127.0.0.1' kwargs['dstaddr'] = '127.0.0.1'
p2p_conn.rpc = self
p2p_conn.peer_connect(**kwargs, net=self.chain, timeout_factor=self.timeout_factor)() p2p_conn.peer_connect(**kwargs, net=self.chain, timeout_factor=self.timeout_factor)()
self.p2ps.append(p2p_conn) self.p2ps.append(p2p_conn)
p2p_conn.wait_until(lambda: p2p_conn.is_connected, check_connected=False) p2p_conn.wait_until(lambda: p2p_conn.is_connected, check_connected=False)