Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p-leaktests.py
Show First 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | |||||
class P2PLeakTest(BitcoinTestFramework): | class P2PLeakTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.extra_args = [['-banscore=' + str(banscore)]] | self.extra_args = [['-banscore=' + str(banscore)]] | ||||
def run_test(self): | def run_test(self): | ||||
no_version_bannode = CNodeNoVersionBan() | no_version_bannode = self.nodes[0].add_p2p_connection( | ||||
no_version_idlenode = CNodeNoVersionIdle() | CNodeNoVersionBan(), send_version=False) | ||||
no_verack_idlenode = CNodeNoVerackIdle() | no_version_idlenode = self.nodes[0].add_p2p_connection( | ||||
CNodeNoVersionIdle(), send_version=False) | |||||
connections = [] | no_verack_idlenode = self.nodes[0].add_p2p_connection( | ||||
connections.append(NodeConn('127.0.0.1', p2p_port( | CNodeNoVerackIdle()) | ||||
0), self.nodes[0], no_version_bannode, send_version=False)) | |||||
connections.append(NodeConn('127.0.0.1', p2p_port( | |||||
0), self.nodes[0], no_version_idlenode, send_version=False)) | |||||
connections.append(NodeConn('127.0.0.1', p2p_port(0), | |||||
self.nodes[0], no_verack_idlenode)) | |||||
no_version_bannode.add_connection(connections[0]) | |||||
no_version_idlenode.add_connection(connections[1]) | |||||
no_verack_idlenode.add_connection(connections[2]) | |||||
NetworkThread().start() # Start up network handling in another thread | NetworkThread().start() # Start up network handling in another thread | ||||
wait_until(lambda: no_version_bannode.ever_connected, | wait_until(lambda: no_version_bannode.ever_connected, | ||||
timeout=10, lock=mininode_lock) | timeout=10, lock=mininode_lock) | ||||
wait_until(lambda: no_version_idlenode.ever_connected, | wait_until(lambda: no_version_idlenode.ever_connected, | ||||
timeout=10, lock=mininode_lock) | timeout=10, lock=mininode_lock) | ||||
wait_until(lambda: no_verack_idlenode.version_received, | wait_until(lambda: no_verack_idlenode.version_received, | ||||
timeout=10, lock=mininode_lock) | timeout=10, lock=mininode_lock) | ||||
# Mine a block and make sure that it's not sent to the connected nodes | # Mine a block and make sure that it's not sent to the connected nodes | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
# Give the node enough time to possibly leak out a message | # Give the node enough time to possibly leak out a message | ||||
time.sleep(5) | time.sleep(5) | ||||
# This node should have been banned | # This node should have been banned | ||||
assert not no_version_bannode.connected | assert not no_version_bannode.connected | ||||
[conn.disconnect_node() for conn in connections] | for _ in range(3): | ||||
self.nodes[0].disconnect_p2p() | |||||
# Wait until all connections are closed | # Wait until all connections are closed | ||||
wait_until(lambda: len(self.nodes[0].getpeerinfo()) == 0) | wait_until(lambda: len(self.nodes[0].getpeerinfo()) == 0) | ||||
# Make sure no unexpected messages came in | # Make sure no unexpected messages came in | ||||
assert(no_version_bannode.unexpected_msg == False) | assert(no_version_bannode.unexpected_msg == False) | ||||
assert(no_version_idlenode.unexpected_msg == False) | assert(no_version_idlenode.unexpected_msg == False) | ||||
assert(no_verack_idlenode.unexpected_msg == False) | assert(no_verack_idlenode.unexpected_msg == False) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
P2PLeakTest().main() | P2PLeakTest().main() |