from lbrynet.dht import constants
from lbrynet.dht.distance import Distance
import logging

from tests.functional.dht.dht_test_environment import TestKademliaBase

log = logging.getLogger()


class TestFindNode(TestKademliaBase):
    """
    This tests the local routing table lookup for a node, every node should return the sorted k contacts closest
    to the querying node (even if the key being looked up is known)
    """
    network_size = 35

    def test_find_node(self):
        last_node_id = self.nodes[-1].node_id
        to_last_node = Distance(last_node_id)
        for n in self.nodes:
            find_close_nodes_result = n._routingTable.findCloseNodes(last_node_id, constants.k)
            self.assertTrue(len(find_close_nodes_result) == constants.k)
            found_ids = [c.id for c in find_close_nodes_result]
            self.assertListEqual(found_ids, sorted(found_ids, key=lambda x: to_last_node(x)))
            if last_node_id in [c.id for c in n.contacts]:
                self.assertTrue(found_ids[0] == last_node_id)
            else:
                self.assertTrue(last_node_id not in found_ids)