Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_node_network_limited.py
Show All 19 Lines | from test_framework.mininode import ( | ||||
mininode_lock, | mininode_lock, | ||||
P2PInterface, | P2PInterface, | ||||
) | ) | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import ( | ||||
assert_equal, | assert_equal, | ||||
connect_nodes_bi, | connect_nodes_bi, | ||||
disconnect_nodes, | disconnect_nodes, | ||||
sync_blocks, | |||||
wait_until, | wait_until, | ||||
) | ) | ||||
class P2PIgnoreInv(P2PInterface): | class P2PIgnoreInv(P2PInterface): | ||||
firstAddrnServices = 0 | firstAddrnServices = 0 | ||||
def on_inv(self, message): | def on_inv(self, message): | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
assert_equal(int(self.nodes[0].getnetworkinfo()[ | assert_equal(int(self.nodes[0].getnetworkinfo()[ | ||||
'localservices'], 16), expected_services) | 'localservices'], 16), expected_services) | ||||
self.log.info( | self.log.info( | ||||
"Mine enough blocks to reach the NODE_NETWORK_LIMITED range.") | "Mine enough blocks to reach the NODE_NETWORK_LIMITED range.") | ||||
connect_nodes_bi(self.nodes[0], self.nodes[1]) | connect_nodes_bi(self.nodes[0], self.nodes[1]) | ||||
blocks = self.nodes[1].generatetoaddress( | blocks = self.nodes[1].generatetoaddress( | ||||
292, self.nodes[1].get_deterministic_priv_key().address) | 292, self.nodes[1].get_deterministic_priv_key().address) | ||||
sync_blocks([self.nodes[0], self.nodes[1]]) | self.sync_blocks([self.nodes[0], self.nodes[1]]) | ||||
self.log.info("Make sure we can max retrieve block at tip-288.") | self.log.info("Make sure we can max retrieve block at tip-288.") | ||||
# last block in valid range | # last block in valid range | ||||
node.send_getdata_for_block(blocks[1]) | node.send_getdata_for_block(blocks[1]) | ||||
node.wait_for_block(int(blocks[1], 16), timeout=3) | node.wait_for_block(int(blocks[1], 16), timeout=3) | ||||
self.log.info( | self.log.info( | ||||
"Requesting block at height 2 (tip-289) must fail (ignored).") | "Requesting block at height 2 (tip-289) must fail (ignored).") | ||||
Show All 13 Lines | def run_test(self): | ||||
self.nodes[0].disconnect_p2ps() | self.nodes[0].disconnect_p2ps() | ||||
node1.wait_for_disconnect() | node1.wait_for_disconnect() | ||||
# connect unsynced node 2 with pruned NODE_NETWORK_LIMITED peer | # connect unsynced node 2 with pruned NODE_NETWORK_LIMITED peer | ||||
# because node 2 is in IBD and node 0 is a NODE_NETWORK_LIMITED peer, | # because node 2 is in IBD and node 0 is a NODE_NETWORK_LIMITED peer, | ||||
# sync must not be possible | # sync must not be possible | ||||
connect_nodes_bi(self.nodes[0], self.nodes[2]) | connect_nodes_bi(self.nodes[0], self.nodes[2]) | ||||
try: | try: | ||||
sync_blocks([self.nodes[0], self.nodes[2]], timeout=5) | self.sync_blocks([self.nodes[0], self.nodes[2]], timeout=5) | ||||
except Exception: | except Exception: | ||||
pass | pass | ||||
# node2 must remain at heigh 0 | # node2 must remain at heigh 0 | ||||
assert_equal(self.nodes[2].getblockheader( | assert_equal(self.nodes[2].getblockheader( | ||||
self.nodes[2].getbestblockhash())['height'], 0) | self.nodes[2].getbestblockhash())['height'], 0) | ||||
# now connect also to node 1 (non pruned) | # now connect also to node 1 (non pruned) | ||||
connect_nodes_bi(self.nodes[1], self.nodes[2]) | connect_nodes_bi(self.nodes[1], self.nodes[2]) | ||||
# sync must be possible | # sync must be possible | ||||
sync_blocks(self.nodes) | self.sync_blocks() | ||||
# disconnect all peers | # disconnect all peers | ||||
self.disconnect_all() | self.disconnect_all() | ||||
# mine 10 blocks on node 0 (pruned node) | # mine 10 blocks on node 0 (pruned node) | ||||
self.nodes[0].generatetoaddress( | self.nodes[0].generatetoaddress( | ||||
10, self.nodes[0].get_deterministic_priv_key().address) | 10, self.nodes[0].get_deterministic_priv_key().address) | ||||
# connect node1 (non pruned) with node0 (pruned) and check if the can | # connect node1 (non pruned) with node0 (pruned) and check if the can | ||||
# sync | # sync | ||||
connect_nodes_bi(self.nodes[0], self.nodes[1]) | connect_nodes_bi(self.nodes[0], self.nodes[1]) | ||||
# sync must be possible, node 1 is no longer in IBD and should | # sync must be possible, node 1 is no longer in IBD and should | ||||
# therefore connect to node 0 (NODE_NETWORK_LIMITED) | # therefore connect to node 0 (NODE_NETWORK_LIMITED) | ||||
sync_blocks([self.nodes[0], self.nodes[1]]) | self.sync_blocks([self.nodes[0], self.nodes[1]]) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
NodeNetworkLimitedTest().main() | NodeNetworkLimitedTest().main() |