test_relays.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import time
  2. from functools import partial
  3. import pytest
  4. import hivemind
  5. async def ping_to_client(dht, node, peer_id: str):
  6. return await node.protocol.call_ping(hivemind.PeerID.from_base58(str(peer_id)))
  7. @pytest.mark.forked
  8. @pytest.mark.parametrize(
  9. "use_auto_relay,use_relay",
  10. [
  11. (True, True),
  12. (False, False),
  13. ],
  14. )
  15. def test_autorelay(use_auto_relay: bool, use_relay: bool):
  16. dht_first_peer = hivemind.DHT(
  17. start=True,
  18. use_auto_relay=use_auto_relay,
  19. use_relay=use_relay,
  20. force_reachability="public",
  21. )
  22. dht_first_peer_id = dht_first_peer.peer_id
  23. initial_peers = dht_first_peer.get_visible_maddrs()
  24. assert dht_first_peer_id is not None
  25. dht_third_peer = hivemind.DHT(
  26. initial_peers=initial_peers,
  27. host_maddrs=[],
  28. start=True,
  29. no_listen=True,
  30. use_relay=use_relay,
  31. client_mode=False,
  32. use_auto_relay=use_auto_relay,
  33. )
  34. time.sleep(5)
  35. dht_second_peer = hivemind.DHT(
  36. initial_peers=initial_peers,
  37. start=True,
  38. client_mode=False,
  39. no_listen=False,
  40. use_relay=use_relay,
  41. use_auto_relay=use_auto_relay,
  42. )
  43. assert dht_first_peer.is_alive() and dht_second_peer.is_alive() and dht_third_peer.is_alive()
  44. time_start = time.perf_counter()
  45. while time.perf_counter() - time_start < 30:
  46. reached_ip = dht_second_peer.run_coroutine(partial(ping_to_client, peer_id=dht_third_peer.peer_id))
  47. if reached_ip:
  48. assert use_relay
  49. break
  50. time.sleep(2)
  51. else:
  52. assert not use_relay
  53. for peer in dht_first_peer, dht_second_peer, dht_third_peer:
  54. peer.shutdown()