diff --git a/test/functional/abandonconflict.py b/test/functional/abandonconflict.py --- a/test/functional/abandonconflict.py +++ b/test/functional/abandonconflict.py @@ -49,7 +49,7 @@ balance = newbalance # Disconnect nodes so node0's transactions don't get into node1's mempool - disconnect_nodes(self.nodes[0], 1) + disconnect_nodes(self.nodes[0], self.nodes[1]) # Identify the 10btc outputs nA = next(i for i, vout in enumerate(self.nodes[0].getrawtransaction( @@ -176,7 +176,7 @@ self.nodes[1].sendrawtransaction(signed["hex"]) self.nodes[1].generate(1) - connect_nodes(self.nodes[0], 1) + connect_nodes(self.nodes[0], self.nodes[1]) sync_blocks(self.nodes) # Verify that B and C's 10 BTC outputs are available for spending again because AB1 is now conflicted diff --git a/test/functional/abc-finalize-block.py b/test/functional/abc-finalize-block.py --- a/test/functional/abc-finalize-block.py +++ b/test/functional/abc-finalize-block.py @@ -38,7 +38,7 @@ assert_equal(node.getbestblockhash(), tip) alt_node = self.nodes[1] - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) sync_blocks(self.nodes[0:2]) alt_node.invalidateblock(tip) diff --git a/test/functional/abc-p2p-compactblocks.py b/test/functional/abc-p2p-compactblocks.py --- a/test/functional/abc-p2p-compactblocks.py +++ b/test/functional/abc-p2p-compactblocks.py @@ -273,7 +273,8 @@ # Check that compact block also work for big blocks node = self.nodes[0] peer = TestNode() - peer.add_connection(NodeConn('127.0.0.1', p2p_port(0), node, peer)) + peer.add_connection( + NodeConn('127.0.0.1', self.p2p_port(0), node, peer)) # Wait for connection to be etablished peer.wait_for_verack() diff --git a/test/functional/abc-parkedchain.py b/test/functional/abc-parkedchain.py --- a/test/functional/abc-parkedchain.py +++ b/test/functional/abc-parkedchain.py @@ -127,7 +127,7 @@ # First, make sure both nodes are in sync. parking_node = self.nodes[1] - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) sync_blocks(self.nodes[0:2]) assert_equal(node.getbestblockhash(), parking_node.getbestblockhash()) diff --git a/test/functional/assumevalid.py b/test/functional/assumevalid.py --- a/test/functional/assumevalid.py +++ b/test/functional/assumevalid.py @@ -45,7 +45,7 @@ msg_headers) from test_framework.script import (CScript, OP_TRUE) from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import (p2p_port, assert_equal) +from test_framework.util import (assert_equal) class BaseNode(NodeConnCB): @@ -102,7 +102,7 @@ node0 = BaseNode() connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], node0)) node0.add_connection(connections[0]) NetworkThread().start() # Start up network handling in another thread @@ -176,14 +176,14 @@ self.start_node(1, extra_args=["-assumevalid=" + hex(block102.sha256)]) node1 = BaseNode() # connects to node1 connections.append( - NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], node1)) + NodeConn('127.0.0.1', self.p2p_port(1), self.nodes[1], node1)) node1.add_connection(connections[1]) node1.wait_for_verack() self.start_node(2, extra_args=["-assumevalid=" + hex(block102.sha256)]) node2 = BaseNode() # connects to node2 connections.append( - NodeConn('127.0.0.1', p2p_port(2), self.nodes[2], node2)) + NodeConn('127.0.0.1', self.p2p_port(2), self.nodes[2], node2)) node2.add_connection(connections[2]) node2.wait_for_verack() diff --git a/test/functional/bip65-cltv-p2p.py b/test/functional/bip65-cltv-p2p.py --- a/test/functional/bip65-cltv-p2p.py +++ b/test/functional/bip65-cltv-p2p.py @@ -74,7 +74,7 @@ node0 = NodeConnCB() connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], node0)) node0.add_connection(connections[0]) # Start up network handling in another thread diff --git a/test/functional/bip68-sequence.py b/test/functional/bip68-sequence.py --- a/test/functional/bip68-sequence.py +++ b/test/functional/bip68-sequence.py @@ -442,13 +442,13 @@ assert_greater_than(csv_activation_height - height, 1) self.nodes[0].generate(csv_activation_height - height - 1) assert_equal(self.get_csv_status(), False) - disconnect_nodes(self.nodes[0], 1) + disconnect_nodes(self.nodes[0], self.nodes[1]) self.nodes[0].generate(1) assert_equal(self.get_csv_status(), True) # We have a block that has CSV activated, but we want to be at # the activation point, so we invalidate the tip. self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) - connect_nodes(self.nodes[0], 1) + connect_nodes(self.nodes[0], self.nodes[1]) sync_blocks(self.nodes) # Use self.nodes[1] to test standardness relay policy diff --git a/test/functional/bipdersig-p2p.py b/test/functional/bipdersig-p2p.py --- a/test/functional/bipdersig-p2p.py +++ b/test/functional/bipdersig-p2p.py @@ -62,7 +62,7 @@ node0 = NodeConnCB() connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], node0)) node0.add_connection(connections[0]) NetworkThread().start() # Start up network handling in another thread diff --git a/test/functional/disconnect_ban.py b/test/functional/disconnect_ban.py --- a/test/functional/disconnect_ban.py +++ b/test/functional/disconnect_ban.py @@ -79,7 +79,7 @@ # Clear ban lists self.nodes[1].clearbanned() - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) self.log.info("Test disconnectnode RPCs") @@ -106,7 +106,7 @@ self.log.info("disconnectnode: successfully reconnect node") # reconnect the node - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) assert_equal(len(self.nodes[0].getpeerinfo()), 2) assert [node for node in self.nodes[0] .getpeerinfo() if node['addr'] == address1] diff --git a/test/functional/example_test.py b/test/functional/example_test.py --- a/test/functional/example_test.py +++ b/test/functional/example_test.py @@ -28,7 +28,6 @@ from test_framework.util import ( assert_equal, connect_nodes, - p2p_port, wait_until, ) @@ -117,7 +116,7 @@ # In this test, we're not connecting node2 to node0 or node1. Calls to # sync_all() should not include node2, since we're not expecting it to # sync. - connect_nodes(self.nodes[0], 1) + connect_nodes(self.nodes[0], self.nodes[1]) self.sync_all([self.nodes[0:1]]) # Use setup_nodes() to customize the node start behaviour (for example if @@ -141,7 +140,7 @@ node0 = BaseNode() connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], node0)) node0.add_connection(connections[0]) # Start up network handling in another thread. This needs to be called @@ -198,12 +197,12 @@ self.nodes[1].waitforblockheight(11) self.log.info("Connect node2 and node1") - connect_nodes(self.nodes[1], 2) + connect_nodes(self.nodes[1], self.nodes[2]) self.log.info("Add P2P connection to node2") node2 = BaseNode() connections.append( - NodeConn('127.0.0.1', p2p_port(2), self.nodes[2], node2)) + NodeConn('127.0.0.1', self.p2p_port(2), self.nodes[2], node2)) node2.add_connection(connections[1]) node2.wait_for_verack() diff --git a/test/functional/fundrawtransaction.py b/test/functional/fundrawtransaction.py --- a/test/functional/fundrawtransaction.py +++ b/test/functional/fundrawtransaction.py @@ -24,10 +24,10 @@ def setup_network(self, split=False): self.setup_nodes() - connect_nodes_bi(self.nodes, 0, 1) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) - connect_nodes_bi(self.nodes, 0, 3) + connect_nodes_bi(self.nodes[0], self.nodes[1]) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[3]) def run_test(self): min_relay_tx_fee = self.nodes[0].getnetworkinfo()['relayfee'] @@ -468,10 +468,10 @@ for node in self.nodes: node.settxfee(min_relay_tx_fee) - connect_nodes_bi(self.nodes, 0, 1) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) - connect_nodes_bi(self.nodes, 0, 3) + connect_nodes_bi(self.nodes[0], self.nodes[1]) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[3]) self.sync_all() # drain the keypool diff --git a/test/functional/import-rescan.py b/test/functional/import-rescan.py --- a/test/functional/import-rescan.py +++ b/test/functional/import-rescan.py @@ -132,7 +132,7 @@ self.add_nodes(self.num_nodes, extra_args) self.start_nodes() for i in range(1, self.num_nodes): - connect_nodes(self.nodes[i], 0) + connect_nodes(self.nodes[i], self.nodes[0]) def run_test(self): # Create one transaction on node 0 with a unique amount and label for diff --git a/test/functional/invalidateblock.py b/test/functional/invalidateblock.py --- a/test/functional/invalidateblock.py +++ b/test/functional/invalidateblock.py @@ -33,7 +33,7 @@ assert(self.nodes[1].getblockcount() == 6) self.log.info("Connect nodes to force a reorg") - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) sync_blocks(self.nodes[0:2]) assert(self.nodes[0].getblockcount() == 6) badhash = self.nodes[1].getblockhash(2) @@ -48,7 +48,7 @@ "Wrong tip for node0, hash %s, height %d" % (newhash, newheight)) self.log.info("\nMake sure we won't reorg to a lower work chain:") - connect_nodes_bi(self.nodes, 1, 2) + connect_nodes_bi(self.nodes[1], self.nodes[2]) self.log.info("Sync node 2 to node 1 so both have 6 blocks") sync_blocks(self.nodes[1:3]) assert(self.nodes[2].getblockcount() == 6) diff --git a/test/functional/keypool-topup.py b/test/functional/keypool-topup.py --- a/test/functional/keypool-topup.py +++ b/test/functional/keypool-topup.py @@ -38,7 +38,7 @@ shutil.copyfile(self.tmpdir + "/node1/regtest/wallet.dat", self.tmpdir + "/wallet.bak") self.start_node(1, self.extra_args[1]) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) self.log.info("Generate keys for wallet") @@ -65,7 +65,7 @@ self.log.info("Verify keypool is restored and balance is correct") self.start_node(1, self.extra_args[1]) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) self.sync_all() assert_equal(self.nodes[1].getbalance(), 15) diff --git a/test/functional/maxuploadtarget.py b/test/functional/maxuploadtarget.py --- a/test/functional/maxuploadtarget.py +++ b/test/functional/maxuploadtarget.py @@ -66,7 +66,7 @@ for i in range(3): test_nodes.append(TestNode()) connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_nodes[i])) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], test_nodes[i])) test_nodes[i].add_connection(connections[i]) # Start up network handling in another thread @@ -163,7 +163,7 @@ # recreate/reconnect a test node test_nodes = [TestNode()] - connections = [NodeConn('127.0.0.1', p2p_port( + connections = [NodeConn('127.0.0.1', self.p2p_port( 0), self.nodes[0], test_nodes[0])] test_nodes[0].add_connection(connections[0]) diff --git a/test/functional/merkle_blocks.py b/test/functional/merkle_blocks.py --- a/test/functional/merkle_blocks.py +++ b/test/functional/merkle_blocks.py @@ -20,9 +20,9 @@ def setup_network(self): self.setup_nodes() - connect_nodes(self.nodes[0], 1) - connect_nodes(self.nodes[0], 2) - connect_nodes(self.nodes[0], 3) + connect_nodes(self.nodes[0], self.nodes[1]) + connect_nodes(self.nodes[0], self.nodes[2]) + connect_nodes(self.nodes[0], self.nodes[3]) self.sync_all() diff --git a/test/functional/minchainwork.py b/test/functional/minchainwork.py --- a/test/functional/minchainwork.py +++ b/test/functional/minchainwork.py @@ -40,7 +40,7 @@ # block relay to inbound peers. self.setup_nodes() for i in range(self.num_nodes-1): - connect_nodes(self.nodes[i+1], i) + connect_nodes(self.nodes[i+1], self.nodes[i]) def run_test(self): # Start building a chain on node0. node2 shouldn't be able to sync until node1's diff --git a/test/functional/net.py b/test/functional/net.py --- a/test/functional/net.py +++ b/test/functional/net.py @@ -14,7 +14,6 @@ assert_equal, assert_raises_rpc_error, connect_nodes_bi, - p2p_port, ) @@ -75,14 +74,14 @@ time.sleep(0.1) self.nodes[0].setnetworkactive(True) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) assert_equal(self.nodes[0].getnetworkinfo()['networkactive'], True) assert_equal(self.nodes[0].getnetworkinfo()['connections'], 2) def _test_getaddednodeinfo(self): assert_equal(self.nodes[0].getaddednodeinfo(), []) # add a node (node2) to node0 - ip_port = "127.0.0.1:{}".format(p2p_port(2)) + ip_port = "127.0.0.1:{}".format(self.p2p_port(2)) self.nodes[0].addnode(ip_port, 'add') # check that the node has indeed been added added_nodes = self.nodes[0].getaddednodeinfo(ip_port) diff --git a/test/functional/notifications.py b/test/functional/notifications.py --- a/test/functional/notifications.py +++ b/test/functional/notifications.py @@ -60,7 +60,7 @@ self.log.info("test -walletnotify after rescan") # restart node to rescan to force wallet notifications self.restart_node(1) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) wait_until(lambda: os.path.isfile(self.tx_filename) and os.stat( self.tx_filename).st_size >= (block_count * 65), timeout=10) diff --git a/test/functional/p2p-acceptblock.py b/test/functional/p2p-acceptblock.py --- a/test/functional/p2p-acceptblock.py +++ b/test/functional/p2p-acceptblock.py @@ -96,10 +96,10 @@ connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_node)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], test_node)) connections.append( - NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], white_node)) - connections.append(NodeConn('127.0.0.1', p2p_port(2), + NodeConn('127.0.0.1', self.p2p_port(1), self.nodes[1], white_node)) + connections.append(NodeConn('127.0.0.1', self.p2p_port(2), self.nodes[2], min_work_node)) test_node.add_connection(connections[0]) white_node.add_connection(connections[1]) @@ -264,7 +264,7 @@ [c.disconnect_node() for c in connections] # 8. Connect node2 to node0 and ensure it is able to sync - connect_nodes(self.nodes[0], 2) + connect_nodes(self.nodes[0], self.nodes[2]) sync_blocks([self.nodes[0], self.nodes[2]]) self.log.info("Successfully synced nodes 2 and 0") diff --git a/test/functional/p2p-compactblocks.py b/test/functional/p2p-compactblocks.py --- a/test/functional/p2p-compactblocks.py +++ b/test/functional/p2p-compactblocks.py @@ -808,10 +808,10 @@ connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], self.test_node)) - connections.append(NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], self.test_node)) + connections.append(NodeConn('127.0.0.1', self.p2p_port(1), self.nodes[1], self.ex_softfork_node, services=NODE_NETWORK)) - connections.append(NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], + connections.append(NodeConn('127.0.0.1', self.p2p_port(1), self.nodes[1], self.old_node, services=NODE_NETWORK)) self.test_node.add_connection(connections[0]) self.ex_softfork_node.add_connection(connections[1]) diff --git a/test/functional/p2p-feefilter.py b/test/functional/p2p-feefilter.py --- a/test/functional/p2p-feefilter.py +++ b/test/functional/p2p-feefilter.py @@ -58,7 +58,7 @@ # Setup the p2p connections and start up the network thread. test_node = TestNode() connection = NodeConn( - '127.0.0.1', p2p_port(0), self.nodes[0], test_node) + '127.0.0.1', self.p2p_port(0), self.nodes[0], test_node) test_node.add_connection(connection) NetworkThread().start() test_node.wait_for_verack() diff --git a/test/functional/p2p-leaktests.py b/test/functional/p2p-leaktests.py --- a/test/functional/p2p-leaktests.py +++ b/test/functional/p2p-leaktests.py @@ -127,11 +127,11 @@ no_verack_idlenode = CNodeNoVerackIdle() connections = [] - connections.append(NodeConn('127.0.0.1', p2p_port( + connections.append(NodeConn('127.0.0.1', self.p2p_port( 0), self.nodes[0], no_version_bannode, send_version=False)) - connections.append(NodeConn('127.0.0.1', p2p_port( + connections.append(NodeConn('127.0.0.1', self.p2p_port( 0), self.nodes[0], no_version_idlenode, send_version=False)) - connections.append(NodeConn('127.0.0.1', p2p_port(0), + connections.append(NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], no_verack_idlenode)) no_version_bannode.add_connection(connections[0]) no_version_idlenode.add_connection(connections[1]) diff --git a/test/functional/p2p-mempool.py b/test/functional/p2p-mempool.py --- a/test/functional/p2p-mempool.py +++ b/test/functional/p2p-mempool.py @@ -17,7 +17,8 @@ def run_test(self): # connect a mininode aTestNode = NodeConnCB() - node = NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], aTestNode) + node = NodeConn('127.0.0.1', self.p2p_port(0), + self.nodes[0], aTestNode) aTestNode.add_connection(node) NetworkThread().start() aTestNode.wait_for_verack() diff --git a/test/functional/p2p-timeouts.py b/test/functional/p2p-timeouts.py --- a/test/functional/p2p-timeouts.py +++ b/test/functional/p2p-timeouts.py @@ -47,11 +47,11 @@ connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], self.no_verack_node)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], self.no_verack_node)) connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], self.no_version_node, send_version=False)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], self.no_version_node, send_version=False)) connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], self.no_send_node, send_version=False)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], self.no_send_node, send_version=False)) self.no_verack_node.add_connection(connections[0]) self.no_version_node.add_connection(connections[1]) self.no_send_node.add_connection(connections[2]) diff --git a/test/functional/preciousblock.py b/test/functional/preciousblock.py --- a/test/functional/preciousblock.py +++ b/test/functional/preciousblock.py @@ -72,7 +72,7 @@ # Submit competing blocks via RPC so any reorg should occur before we # proceed (no way to wait on inaction for p2p sync) node_sync_via_rpc(self.nodes[0:2]) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) assert_equal(self.nodes[0].getbestblockhash(), hashC) assert_equal(self.nodes[1].getbestblockhash(), hashG) self.log.info("Make Node0 prefer block G") @@ -111,8 +111,8 @@ hashL = self.nodes[2].getbestblockhash() self.log.info("Connect nodes and check no reorg occurs") node_sync_via_rpc(self.nodes[1:3]) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) assert_equal(self.nodes[0].getbestblockhash(), hashH) assert_equal(self.nodes[1].getbestblockhash(), hashH) assert_equal(self.nodes[2].getbestblockhash(), hashL) diff --git a/test/functional/proxy_test.py b/test/functional/proxy_test.py --- a/test/functional/proxy_test.py +++ b/test/functional/proxy_test.py @@ -47,17 +47,20 @@ self.num_nodes = 4 def setup_nodes(self): + # We will start 3 socks proxies, and 3 nodes. + # Use rpc_port #3,#4, and ipv6 #5 for the socks proxies + # Use rpc_port 0,1,2 for the nodes rpc ports self.have_ipv6 = test_ipv6_local() # Create two proxies on different ports # ... one unauthenticated self.conf1 = Socks5Configuration() - self.conf1.addr = ('127.0.0.1', RANGE_BEGIN + (os.getpid() % 1000)) + self.conf1.addr = ('127.0.0.1', self.rpc_port(4)) self.conf1.unauth = True self.conf1.auth = False # ... one supporting authenticated and unauthenticated (Tor) self.conf2 = Socks5Configuration() self.conf2.addr = ( - '127.0.0.1', RANGE_BEGIN + 1000 + (os.getpid() % 1000)) + '127.0.0.1', RANGE_BEGIN + 1000 + self.rpc_port(5)) self.conf2.unauth = True self.conf2.auth = True if self.have_ipv6: @@ -65,7 +68,7 @@ self.conf3 = Socks5Configuration() self.conf3.af = socket.AF_INET6 self.conf3.addr = ( - '::1', RANGE_BEGIN + 2000 + (os.getpid() % 1000)) + '::1', self.rpc_port(6)) self.conf3.unauth = True self.conf3.auth = True else: diff --git a/test/functional/pruning.py b/test/functional/pruning.py --- a/test/functional/pruning.py +++ b/test/functional/pruning.py @@ -58,11 +58,11 @@ self.prunedir = self.options.tmpdir + "/node2/regtest/blocks/" - connect_nodes(self.nodes[0], 1) - connect_nodes(self.nodes[1], 2) - connect_nodes(self.nodes[2], 0) - connect_nodes(self.nodes[0], 3) - connect_nodes(self.nodes[0], 4) + connect_nodes(self.nodes[0], self.nodes[1]) + connect_nodes(self.nodes[1], self.nodes[2]) + connect_nodes(self.nodes[2], self.nodes[0]) + connect_nodes(self.nodes[0], self.nodes[3]) + connect_nodes(self.nodes[0], self.nodes[4]) sync_blocks(self.nodes[0:5]) def setup_nodes(self): @@ -135,8 +135,8 @@ # Create connections in the order so both nodes can see the reorg # at the same time - connect_nodes(self.nodes[1], 0) - connect_nodes(self.nodes[2], 0) + connect_nodes(self.nodes[1], self.nodes[0]) + connect_nodes(self.nodes[2], self.nodes[0]) sync_blocks(self.nodes[0:3]) self.log.info("Usage can be over target because of high stale rate: %d" % @@ -185,8 +185,8 @@ self.nodes[1].generate(300) self.log.info("Reconnect nodes") - connect_nodes(self.nodes[0], 1) - connect_nodes(self.nodes[2], 1) + connect_nodes(self.nodes[0], self.nodes[1]) + connect_nodes(self.nodes[2], self.nodes[1]) sync_blocks(self.nodes[0:3], timeout=120) self.log.info("Verify height on node 2: %d" % @@ -378,7 +378,7 @@ # check that wallet loads loads successfully when restarting a pruned node after IBD. # this was reported to fail in #7494. self.log.info("Syncing node 5 to test wallet") - connect_nodes(self.nodes[0], 5) + connect_nodes(self.nodes[0], self.nodes[5]) nds = [self.nodes[0], self.nodes[5]] sync_blocks(nds, wait=5, timeout=300) self.stop_node(5) # stop and start to trigger rescan diff --git a/test/functional/rawtransactions.py b/test/functional/rawtransactions.py --- a/test/functional/rawtransactions.py +++ b/test/functional/rawtransactions.py @@ -26,7 +26,7 @@ def setup_network(self, split=False): super().setup_network() - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[0], self.nodes[2]) def run_test(self): # prepare some coins for multiple *rawtransaction commands diff --git a/test/functional/rest.py b/test/functional/rest.py --- a/test/functional/rest.py +++ b/test/functional/rest.py @@ -59,7 +59,7 @@ def setup_network(self, split=False): super().setup_network() - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[0], self.nodes[2]) def run_test(self): url = urllib.parse.urlparse(self.nodes[0].url) diff --git a/test/functional/rpcbind_test.py b/test/functional/rpcbind_test.py --- a/test/functional/rpcbind_test.py +++ b/test/functional/rpcbind_test.py @@ -47,8 +47,8 @@ self.nodes[0].rpchost = None self.start_nodes([base_args]) # connect to node through non-loopback interface - node = get_rpc_proxy(rpc_url(get_datadir_path(self.options.tmpdir, 0), 0, "%s:%d" % ( - rpchost, rpcport)), 0, coveragedir=self.options.coveragedir) + node = get_rpc_proxy(rpc_url(get_datadir_path( + self.options.tmpdir, 0), 0, rpchost, rpcport), 0, coveragedir=self.options.coveragedir) node.getnetworkinfo() self.stop_nodes() @@ -74,7 +74,7 @@ self.log.info("Using interface %s for testing" % non_loopback_ip) - defaultport = rpc_port(0) + defaultport = self.rpc_port(0) # check default without rpcallowip (IPv4 and IPv6 localhost) self.run_bind_test(None, '127.0.0.1', [], diff --git a/test/functional/sendheaders.py b/test/functional/sendheaders.py --- a/test/functional/sendheaders.py +++ b/test/functional/sendheaders.py @@ -223,10 +223,10 @@ connections = [] connections.append( - NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], inv_node)) + NodeConn('127.0.0.1', self.p2p_port(0), self.nodes[0], inv_node)) # Set nServices to 0 for test_node, so no block download will occur outside of # direct fetching - connections.append(NodeConn('127.0.0.1', p2p_port( + connections.append(NodeConn('127.0.0.1', self.p2p_port( 0), self.nodes[0], test_node, services=0)) inv_node.add_connection(connections[0]) test_node.add_connection(connections[1]) diff --git a/test/functional/test_framework/comptool.py b/test/functional/test_framework/comptool.py --- a/test/functional/test_framework/comptool.py +++ b/test/functional/test_framework/comptool.py @@ -19,7 +19,7 @@ from .mininode import * from .blockstore import BlockStore, TxStore -from .util import p2p_port, wait_until +from .util import wait_until import logging @@ -191,7 +191,7 @@ test_node = TestNode(self.block_store, self.tx_store) self.test_nodes.append(test_node) self.connections.append( - NodeConn('127.0.0.1', p2p_port(i), nodes[i], test_node)) + NodeConn('127.0.0.1', self.test_generator.p2p_port(i), nodes[i], test_node)) # Make sure the TestNode (callback class) has a reference to its # associated NodeConn test_node.add_connection(self.connections[-1]) diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -21,14 +21,14 @@ from .test_node import TestNode from .util import ( MAX_NODES, - PortSeed, + PORT_MIN, + PORT_RANGE, assert_equal, check_json_precision, connect_nodes_bi, disconnect_nodes, initialize_datadir, log_filename, - p2p_port, set_node_times, sync_blocks, sync_mempools, @@ -101,7 +101,7 @@ assert hasattr( self, "num_nodes"), "Test must set self.num_nodes in set_test_params()" - PortSeed.n = self.options.port_seed + self.port_seed = self.options.port_seed os.environ['PATH'] = self.options.srcdir + ":" + \ self.options.srcdir + "/qt:" + os.environ['PATH'] @@ -210,7 +210,7 @@ # to split the network between nodes 1 and 2 to get # two halves that can work on competing chains. for i in range(self.num_nodes - 1): - connect_nodes_bi(self.nodes, i, i + 1) + connect_nodes_bi(self.nodes[i], self.nodes[i+1]) self.sync_all() def setup_nodes(self): @@ -227,7 +227,7 @@ # Public helper methods. These can be accessed by the subclass test scripts. - def add_nodes(self, num_nodes, extra_args=None, rpchost=None, timewait=None, binary=None): + def add_nodes(self, num_nodes, extra_args=None, host="127.0.0.1", timewait=None, binary=None): """Instantiate TestNode objects""" if extra_args is None: @@ -237,7 +237,7 @@ assert_equal(len(extra_args), num_nodes) assert_equal(len(binary), num_nodes) for i in range(num_nodes): - self.nodes.append(TestNode(i, self.options.tmpdir, extra_args[i], rpchost, timewait=timewait, + self.nodes.append(TestNode(i, self.options.tmpdir, extra_args[i], host, self.rpc_port(i), self.p2p_port(i), timewait=timewait, binary=binary[i], stderr=None, mocktime=self.mocktime, coverage_dir=self.options.coveragedir)) def start_node(self, i, extra_args=None, stderr=None): @@ -292,6 +292,13 @@ self.stop_node(i) self.start_node(i, extra_args) + def rpc_port(self, n): + return PORT_MIN + PORT_RANGE + n + (MAX_NODES * self.port_seed) % (PORT_RANGE - 1 - MAX_NODES) + + def p2p_port(self, n): + assert(n <= MAX_NODES) + return PORT_MIN + n + (MAX_NODES * self.port_seed) % (PORT_RANGE - 1 - MAX_NODES) + def assert_start_raises_init_error(self, i, extra_args=None, expected_msg=None): with tempfile.SpooledTemporaryFile(max_size=2**16) as log_stderr: try: @@ -321,15 +328,15 @@ """ Split the network of four nodes into nodes 0/1 and 2/3. """ - disconnect_nodes(self.nodes[1], 2) - disconnect_nodes(self.nodes[2], 1) + disconnect_nodes(self.nodes[1], self.nodes[2]) + disconnect_nodes(self.nodes[2], self.nodes[1]) self.sync_all([self.nodes[:2], self.nodes[2:]]) def join_network(self): """ Join the (previously split) network halves together. """ - connect_nodes_bi(self.nodes, 1, 2) + connect_nodes_bi(self.nodes[1], self.nodes[2]) self.sync_all() def sync_all(self, node_groups=None): @@ -413,13 +420,14 @@ # Create cache directories, run bitcoinds: for i in range(MAX_NODES): - datadir = initialize_datadir(self.options.cachedir, i) + datadir = initialize_datadir( + self.options.cachedir, i, self.p2p_port(i), self.rpc_port(i)) args = [os.getenv("BITCOIND", "bitcoind"), "-server", "-keypool=1", "-datadir=" + datadir, "-discover=0"] if i > 0: - args.append("-connect=127.0.0.1:" + str(p2p_port(0))) + args.append("-connect=127.0.0.1:" + str(self.p2p_port(0))) self.nodes.append(TestNode(i, self.options.cachedir, extra_args=[ - ], rpchost=None, timewait=None, binary=None, stderr=None, mocktime=self.mocktime, coverage_dir=None)) + ], host=None, rpc_port=self.rpc_port(i), p2p_port=self.p2p_port(i), timewait=None, binary=None, stderr=None, mocktime=self.mocktime, coverage_dir=None)) self.nodes[i].args = args self.start_node(i) @@ -460,7 +468,8 @@ to_dir = os.path.join(self.options.tmpdir, "node" + str(i)) shutil.copytree(from_dir, to_dir) # Overwrite port/rpcport in bitcoin.conf - initialize_datadir(self.options.tmpdir, i) + initialize_datadir(self.options.tmpdir, i, + self.p2p_port(i), self.rpc_port(i)) def _initialize_chain_clean(self): """Initialize empty blockchain for use by the test. @@ -468,7 +477,8 @@ Create an empty blockchain and num_nodes wallets. Useful if a test case wants complete control over initialization.""" for i in range(self.num_nodes): - initialize_datadir(self.options.tmpdir, i) + initialize_datadir(self.options.tmpdir, i, + self.p2p_port(i), self.rpc_port(i)) class ComparisonTestFramework(BitcoinTestFramework): diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -37,10 +37,13 @@ To make things easier for the test writer, a bit of magic is happening under the covers. Any unrecognised messages will be dispatched to the RPC connection.""" - def __init__(self, i, dirname, extra_args, rpchost, timewait, binary, stderr, mocktime, coverage_dir): + def __init__(self, i, dirname, extra_args, host, rpc_port, p2p_port, timewait, binary, stderr, mocktime, coverage_dir): self.index = i self.datadir = os.path.join(dirname, "node" + str(i)) - self.rpchost = rpchost + self.host = host + self.rpc_port = rpc_port + self.p2p_port = p2p_port + self.nodename = "testnode{}".format(i) if timewait: self.rpc_timeout = timewait else: @@ -55,7 +58,7 @@ # Most callers will just need to add extra args to the standard list below. For those callers that need more flexibity, they can just set the args property directly. self.extra_args = extra_args self.args = [self.binary, "-datadir=" + self.datadir, "-server", "-keypool=1", "-discover=0", "-rest", "-logtimemicros", - "-debug", "-debugexclude=libevent", "-debugexclude=leveldb", "-mocktime=" + str(mocktime), "-uacomment=testnode%d" % i] + "-debug", "-debugexclude=libevent", "-debugexclude=leveldb", "-mocktime=" + str(mocktime), "-uacomment={}".format(self.nodename)] self.cli = TestNodeCLI( os.getenv("BITCOINCLI", "bitcoin-cli"), self.datadir) @@ -92,7 +95,7 @@ assert self.process.poll( ) is None, "bitcoind exited with status %i during initialization" % self.process.returncode try: - self.rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.rpchost), + self.rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.host, self.rpc_port), self.index, timeout=self.rpc_timeout, coveragedir=self.coverage_dir) self.rpc.getblockcount() # If the call to getblockcount() succeeds then the RPC connection is up diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -270,11 +270,6 @@ PORT_RANGE = 5000 -class PortSeed: - # Must be initialized with a unique integer for each process - n = None - - def get_rpc_proxy(url, node_number, timeout=None, coveragedir=None): """ Args: @@ -301,39 +296,25 @@ return coverage.AuthServiceProxyWrapper(proxy, coverage_logfile) -def p2p_port(n): - assert(n <= MAX_NODES) - return PORT_MIN + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) - - -def rpc_port(n): - return PORT_MIN + PORT_RANGE + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES) - - -def rpc_url(datadir, i, rpchost=None): +def rpc_url(datadir, i, rpchost, rpc_port): rpc_u, rpc_p = get_auth_cookie(datadir) host = '127.0.0.1' - port = rpc_port(i) if rpchost: - parts = rpchost.split(':') - if len(parts) == 2: - host, port = parts - else: - host = rpchost - return "http://%s:%s@%s:%d" % (rpc_u, rpc_p, host, int(port)) + host = rpchost + return "http://%s:%s@%s:%d" % (rpc_u, rpc_p, host, int(rpc_port)) # Node functions ################ -def initialize_datadir(dirname, n): +def initialize_datadir(dirname, n, p2p_port, rpc_port): datadir = os.path.join(dirname, "node" + str(n)) if not os.path.isdir(datadir): os.makedirs(datadir) with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f: f.write("regtest=1\n") - f.write("port=" + str(p2p_port(n)) + "\n") - f.write("rpcport=" + str(rpc_port(n)) + "\n") + f.write("port=" + str(p2p_port) + "\n") + f.write("rpcport=" + str(rpc_port) + "\n") f.write("listenonion=0\n") f.write("usecashaddr=1\n") return datadir @@ -380,20 +361,20 @@ node.setmocktime(t) -def disconnect_nodes(from_connection, node_num): - for peer_id in [peer['id'] for peer in from_connection.getpeerinfo() if "testnode%d" % node_num in peer['subver']]: +def disconnect_nodes(from_connection, node): + for peer_id in [peer['id'] for peer in from_connection.getpeerinfo() if node.nodename in peer['subver']]: from_connection.disconnectnode(nodeid=peer_id) for _ in range(50): - if [peer['id'] for peer in from_connection.getpeerinfo() if "testnode%d" % node_num in peer['subver']] == []: + if [peer['id'] for peer in from_connection.getpeerinfo() if node.nodename in peer['subver']] == []: break time.sleep(0.1) else: raise AssertionError("timed out waiting for disconnect") -def connect_nodes(from_connection, node_num): - ip_port = "127.0.0.1:" + str(p2p_port(node_num)) +def connect_nodes(from_connection, node): + ip_port = "{}:{}".format(node.host, node.p2p_port) from_connection.addnode(ip_port, "onetry") # poll until version handshake complete to avoid race conditions # with transaction relaying @@ -401,9 +382,9 @@ time.sleep(0.1) -def connect_nodes_bi(nodes, a, b): - connect_nodes(nodes[a], b) - connect_nodes(nodes[b], a) +def connect_nodes_bi(a, b): + connect_nodes(a, b) + connect_nodes(b, a) def sync_blocks(rpc_connections, *, wait=1, timeout=60): diff --git a/test/functional/txn_clone.py b/test/functional/txn_clone.py --- a/test/functional/txn_clone.py +++ b/test/functional/txn_clone.py @@ -20,8 +20,8 @@ def setup_network(self): # Start with split network: super(TxnMallTest, self).setup_network() - disconnect_nodes(self.nodes[1], 2) - disconnect_nodes(self.nodes[2], 1) + disconnect_nodes(self.nodes[1], self.nodes[2]) + disconnect_nodes(self.nodes[2], self.nodes[1]) def run_test(self): # All nodes should start with 1,250 BTC: @@ -122,7 +122,7 @@ self.nodes[2].generate(1) # Reconnect the split network, and sync chain: - connect_nodes(self.nodes[1], 2) + connect_nodes(self.nodes[1], self.nodes[2]) self.nodes[2].sendrawtransaction(fund_bar_tx["hex"]) self.nodes[2].sendrawtransaction(tx2["hex"]) self.nodes[2].generate(1) # Mine another block to make sure we sync diff --git a/test/functional/txn_doublespend.py b/test/functional/txn_doublespend.py --- a/test/functional/txn_doublespend.py +++ b/test/functional/txn_doublespend.py @@ -20,8 +20,8 @@ def setup_network(self): # Start with split network: super().setup_network() - disconnect_nodes(self.nodes[1], 2) - disconnect_nodes(self.nodes[2], 1) + disconnect_nodes(self.nodes[1], self.nodes[2]) + disconnect_nodes(self.nodes[2], self.nodes[1]) def run_test(self): # All nodes should start with 1,250 BTC: @@ -109,7 +109,7 @@ self.nodes[2].generate(1) # Reconnect the split network, and sync chain: - connect_nodes(self.nodes[1], 2) + connect_nodes(self.nodes[1], self.nodes[2]) self.nodes[2].generate(1) # Mine another block to make sure we sync sync_blocks(self.nodes) assert_equal(self.nodes[0].gettransaction( diff --git a/test/functional/wallet.py b/test/functional/wallet.py --- a/test/functional/wallet.py +++ b/test/functional/wallet.py @@ -20,9 +20,9 @@ self.start_node(0) self.start_node(1) self.start_node(2) - connect_nodes_bi(self.nodes, 0, 1) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[0], self.nodes[1]) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) self.sync_all([self.nodes[0:3]]) def check_fee_amount(self, curr_balance, balance_with_fee, fee_per_byte, tx_size): @@ -204,7 +204,7 @@ sync_mempools(self.nodes[0:2]) self.start_node(3) - connect_nodes_bi(self.nodes, 0, 3) + connect_nodes_bi(self.nodes[0], self.nodes[3]) sync_blocks(self.nodes) relayed = self.nodes[0].resendwallettransactions() @@ -253,9 +253,9 @@ self.start_node(0, ["-walletbroadcast=0"]) self.start_node(1, ["-walletbroadcast=0"]) self.start_node(2, ["-walletbroadcast=0"]) - connect_nodes_bi(self.nodes, 0, 1) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[0], self.nodes[1]) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) self.sync_all([self.nodes[0:3]]) txIdNotBroadcasted = self.nodes[0].sendtoaddress( @@ -283,9 +283,9 @@ self.start_node(0) self.start_node(1) self.start_node(2) - connect_nodes_bi(self.nodes, 0, 1) - connect_nodes_bi(self.nodes, 1, 2) - connect_nodes_bi(self.nodes, 0, 2) + connect_nodes_bi(self.nodes[0], self.nodes[1]) + connect_nodes_bi(self.nodes[1], self.nodes[2]) + connect_nodes_bi(self.nodes[0], self.nodes[2]) sync_blocks(self.nodes[0:3]) self.nodes[0].generate(1) diff --git a/test/functional/wallet_hd.py b/test/functional/wallet_hd.py --- a/test/functional/wallet_hd.py +++ b/test/functional/wallet_hd.py @@ -27,7 +27,7 @@ self.assert_start_raises_init_error( 1, ['-usehd=0'], 'already existing HD wallet') self.start_node(1) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) # Make sure we use hd, keep masterkeyid masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] @@ -89,7 +89,7 @@ assert_equal(hd_info_2["hdkeypath"], "m/0'/0'/" + str(_) + "'") assert_equal(hd_info_2["hdmasterkeyid"], masterkeyid) assert_equal(hd_add, hd_add_2) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) self.sync_all() # Needs rescan @@ -104,7 +104,7 @@ shutil.copyfile(os.path.join(tmpdir, "hd.bak"), os.path.join(tmpdir, "node1/regtest/wallet.dat")) self.start_node(1, extra_args=self.extra_args[1]) - connect_nodes_bi(self.nodes, 0, 1) + connect_nodes_bi(self.nodes[0], self.nodes[1]) self.sync_all() out = self.nodes[1].rescanblockchain(0, 1) assert_equal(out['start_height'], 0) diff --git a/test/functional/walletbackup.py b/test/functional/walletbackup.py --- a/test/functional/walletbackup.py +++ b/test/functional/walletbackup.py @@ -47,10 +47,10 @@ def setup_network(self, split=False): self.setup_nodes() - connect_nodes(self.nodes[0], 3) - connect_nodes(self.nodes[1], 3) - connect_nodes(self.nodes[2], 3) - connect_nodes(self.nodes[2], 0) + connect_nodes(self.nodes[0], self.nodes[3]) + connect_nodes(self.nodes[1], self.nodes[3]) + connect_nodes(self.nodes[2], self.nodes[3]) + connect_nodes(self.nodes[2], self.nodes[0]) self.sync_all() def one_send(self, from_node, to_address): @@ -81,10 +81,10 @@ self.start_node(0) self.start_node(1) self.start_node(2) - connect_nodes(self.nodes[0], 3) - connect_nodes(self.nodes[1], 3) - connect_nodes(self.nodes[2], 3) - connect_nodes(self.nodes[2], 0) + connect_nodes(self.nodes[0], self.nodes[3]) + connect_nodes(self.nodes[1], self.nodes[3]) + connect_nodes(self.nodes[2], self.nodes[3]) + connect_nodes(self.nodes[2], self.nodes[0]) def stop_three(self): self.stop_node(0)