Changeset View
Changeset View
Standalone View
Standalone View
test/functional/rpc_net.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2017 The Bitcoin Core developers | # Copyright (c) 2017 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test RPC calls related to net. | """Test RPC calls related to net. | ||||
Tests correspond to code in rpc/net.cpp. | Tests correspond to code in rpc/net.cpp. | ||||
""" | """ | ||||
from decimal import Decimal | from decimal import Decimal | ||||
from itertools import product | from itertools import product | ||||
import time | import time | ||||
from test_framework.avatools import create_coinbase_stakes | |||||
from test_framework.key import ECKey | |||||
from test_framework.p2p import P2PInterface | from test_framework.p2p import P2PInterface | ||||
import test_framework.messages | import test_framework.messages | ||||
from test_framework.messages import ( | from test_framework.messages import ( | ||||
CAddress, | CAddress, | ||||
msg_addr, | msg_addr, | ||||
NODE_NETWORK, | NODE_NETWORK, | ||||
) | ) | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
Show All 22 Lines | for servicename in servicenames: | ||||
test_framework.messages, 'NODE_' + servicename) | test_framework.messages, 'NODE_' + servicename) | ||||
assert servicesflag_generated == servicesflag | assert servicesflag_generated == servicesflag | ||||
class NetTest(BitcoinTestFramework): | class NetTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
self.extra_args = [["-minrelaytxfee=10"], | self.extra_args = [["-enableavalanche=1", "-minrelaytxfee=10"], | ||||
["-minrelaytxfee=5"]] | ["-enableavalanche=1", "-minrelaytxfee=5"]] | ||||
self.supports_cli = False | self.supports_cli = False | ||||
def run_test(self): | def run_test(self): | ||||
# Get out of IBD for the minfeefilter and getpeerinfo tests. | # Get out of IBD for the minfeefilter and getpeerinfo tests. | ||||
self.nodes[0].generate(101) | self.nodes[0].generate(101) | ||||
# Connect nodes both ways. | # Connect nodes both ways. | ||||
connect_nodes(self.nodes[0], self.nodes[1]) | connect_nodes(self.nodes[0], self.nodes[1]) | ||||
connect_nodes(self.nodes[1], self.nodes[0]) | connect_nodes(self.nodes[1], self.nodes[0]) | ||||
▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | def test_getaddednodeinfo(self): | ||||
assert_equal(len(added_nodes), 1) | assert_equal(len(added_nodes), 1) | ||||
assert_equal(added_nodes[0]['addednode'], ip_port) | assert_equal(added_nodes[0]['addednode'], ip_port) | ||||
# check that a non-existent node returns an error | # check that a non-existent node returns an error | ||||
assert_raises_rpc_error(-24, "Node has not been added", | assert_raises_rpc_error(-24, "Node has not been added", | ||||
self.nodes[0].getaddednodeinfo, '1.1.1.1') | self.nodes[0].getaddednodeinfo, '1.1.1.1') | ||||
def test_getpeerinfo(self): | def test_getpeerinfo(self): | ||||
self.log.info("Test getpeerinfo") | self.log.info("Test getpeerinfo") | ||||
# Create a few getpeerinfo last_block/last_transaction values. | # Create a few getpeerinfo last_block/last_transaction/last_proof | ||||
# values. | |||||
if self.is_wallet_compiled(): | if self.is_wallet_compiled(): | ||||
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1000000) | self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1000000) | ||||
self.nodes[1].generate(1) | tip = self.nodes[1].generate(1)[0] | ||||
self.sync_all() | self.sync_all() | ||||
stake = create_coinbase_stakes( | |||||
self.nodes[1], [tip], self.nodes[1].get_deterministic_priv_key().key) | |||||
privkey = ECKey() | |||||
privkey.generate() | |||||
proof = self.nodes[1].buildavalancheproof( | |||||
42, 2000000000, privkey.get_pubkey().get_bytes().hex(), stake) | |||||
self.nodes[1].sendavalancheproof(proof) | |||||
self.sync_proofs() | |||||
time_now = int(time.time()) | time_now = int(time.time()) | ||||
peer_info = [x.getpeerinfo() for x in self.nodes] | peer_info = [x.getpeerinfo() for x in self.nodes] | ||||
# Verify last_block and last_transaction keys/values. | # Verify last_block, last_transaction and last_proof keys/values. | ||||
for node, peer, field in product(range(self.num_nodes), range(2), [ | for node, peer, field in product(range(self.num_nodes), range(2), [ | ||||
'last_block', 'last_transaction']): | 'last_block', 'last_transaction', 'last_proof']): | ||||
assert field in peer_info[node][peer].keys() | assert field in peer_info[node][peer].keys() | ||||
if peer_info[node][peer][field] != 0: | if peer_info[node][peer][field] != 0: | ||||
assert_approx(peer_info[node][peer][field], time_now, vspan=60) | assert_approx(peer_info[node][peer][field], time_now, vspan=60) | ||||
# check both sides of bidirectional connection between nodes | # check both sides of bidirectional connection between nodes | ||||
# the address bound to on one side will be the source address for the | # the address bound to on one side will be the source address for the | ||||
# other node | # other node | ||||
assert_equal(peer_info[0][0]['addrbind'], peer_info[1][0]['addr']) | assert_equal(peer_info[0][0]['addrbind'], peer_info[1][0]['addr']) | ||||
assert_equal(peer_info[1][0]['addrbind'], peer_info[0][0]['addr']) | assert_equal(peer_info[1][0]['addrbind'], peer_info[0][0]['addr']) | ||||
▲ Show 20 Lines • Show All 58 Lines • Show Last 20 Lines |