forked from LBRYCommunity/lbry-sdk
58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
|
import asyncio
|
||
|
|
||
|
from lbrynet.dht import constants
|
||
|
from lbrynet.dht.node import Node
|
||
|
from lbrynet.dht.peer import PeerManager, KademliaPeer
|
||
|
from torba.testcase import AsyncioTestCase
|
||
|
|
||
|
|
||
|
class CLIIntegrationTest(AsyncioTestCase):
|
||
|
|
||
|
async def asyncSetUp(self):
|
||
|
import logging
|
||
|
logging.getLogger('asyncio').setLevel(logging.ERROR)
|
||
|
logging.getLogger('lbrynet.dht').setLevel(logging.DEBUG)
|
||
|
self.nodes = []
|
||
|
self.known_node_addresses = []
|
||
|
|
||
|
async def setup_network(self, size: int, start_port=40000):
|
||
|
for i in range(size):
|
||
|
node_port = start_port + i
|
||
|
node = Node(self.loop, PeerManager(self.loop), node_id=constants.generate_id(i),
|
||
|
udp_port=node_port, internal_udp_port=node_port,
|
||
|
peer_port=3333, external_ip='127.0.0.1')
|
||
|
self.nodes.append(node)
|
||
|
self.known_node_addresses.append(('127.0.0.1', node_port))
|
||
|
await node.start_listening('127.0.0.1')
|
||
|
for node in self.nodes:
|
||
|
node.protocol.rpc_timeout = .2
|
||
|
node.protocol.ping_queue._default_delay = .5
|
||
|
node.start('127.0.0.1', self.known_node_addresses[:1])
|
||
|
await asyncio.gather(*[node.joined.wait() for node in self.nodes])
|
||
|
|
||
|
async def asyncTearDown(self):
|
||
|
for node in self.nodes:
|
||
|
node.stop()
|
||
|
|
||
|
async def test_replace_bad_nodes(self):
|
||
|
await self.setup_network(20)
|
||
|
self.assertEquals(len(self.nodes), 20)
|
||
|
node = self.nodes[0]
|
||
|
bad_peers = []
|
||
|
for candidate in self.nodes[1:10]:
|
||
|
address, port, node_id = candidate.protocol.external_ip, candidate.protocol.udp_port, candidate.protocol.node_id
|
||
|
peer = KademliaPeer(self.loop, address, node_id, port)
|
||
|
bad_peers.append(peer)
|
||
|
node.protocol.add_peer(peer)
|
||
|
candidate.stop()
|
||
|
await asyncio.sleep(.3) # let pending events settle
|
||
|
for bad_peer in bad_peers:
|
||
|
self.assertIn(bad_peer, node.protocol.routing_table.get_peers())
|
||
|
await node.refresh_node(True)
|
||
|
await asyncio.sleep(.3) # let pending events settle
|
||
|
good_nodes = {good_node.protocol.node_id for good_node in self.nodes[10:]}
|
||
|
for peer in node.protocol.routing_table.get_peers():
|
||
|
self.assertIn(peer.node_id, good_nodes)
|
||
|
|
||
|
|