|
@@ -0,0 +1,64 @@
|
|
|
+import time
|
|
|
+from functools import partial
|
|
|
+
|
|
|
+import pytest
|
|
|
+
|
|
|
+import hivemind
|
|
|
+
|
|
|
+
|
|
|
+async def ping_to_client(dht, node, peer_id: str):
|
|
|
+ return await node.protocol.call_ping(hivemind.PeerID.from_base58(str(peer_id)))
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.forked
|
|
|
+@pytest.mark.parametrize(
|
|
|
+ "use_auto_relay,use_relay",
|
|
|
+ [
|
|
|
+ (True, True),
|
|
|
+ (False, False),
|
|
|
+ ],
|
|
|
+)
|
|
|
+def test_autorelay(use_auto_relay: bool, use_relay: bool):
|
|
|
+ dht_first_peer = hivemind.DHT(
|
|
|
+ start=True,
|
|
|
+ use_auto_relay=use_auto_relay,
|
|
|
+ use_relay=use_relay,
|
|
|
+ force_reachability="public",
|
|
|
+ )
|
|
|
+ dht_first_peer_id = dht_first_peer.peer_id
|
|
|
+ initial_peers = dht_first_peer.get_visible_maddrs()
|
|
|
+ assert dht_first_peer_id is not None
|
|
|
+
|
|
|
+ dht_third_peer = hivemind.DHT(
|
|
|
+ initial_peers=initial_peers,
|
|
|
+ host_maddrs=[],
|
|
|
+ start=True,
|
|
|
+ no_listen=True,
|
|
|
+ use_relay=use_relay,
|
|
|
+ client_mode=False,
|
|
|
+ use_auto_relay=use_auto_relay,
|
|
|
+ )
|
|
|
+ time.sleep(5)
|
|
|
+ dht_second_peer = hivemind.DHT(
|
|
|
+ initial_peers=initial_peers,
|
|
|
+ start=True,
|
|
|
+ client_mode=False,
|
|
|
+ no_listen=False,
|
|
|
+ use_relay=use_relay,
|
|
|
+ use_auto_relay=use_auto_relay,
|
|
|
+ )
|
|
|
+
|
|
|
+ assert dht_first_peer.is_alive() and dht_second_peer.is_alive() and dht_third_peer.is_alive()
|
|
|
+
|
|
|
+ time_start = time.perf_counter()
|
|
|
+ while time.perf_counter() - time_start < 30:
|
|
|
+ reached_ip = dht_second_peer.run_coroutine(partial(ping_to_client, peer_id=dht_third_peer.peer_id))
|
|
|
+ if reached_ip:
|
|
|
+ assert use_relay
|
|
|
+ break
|
|
|
+ time.sleep(2)
|
|
|
+ else:
|
|
|
+ assert not use_relay
|
|
|
+
|
|
|
+ for peer in dht_first_peer, dht_second_peer, dht_third_peer:
|
|
|
+ peer.shutdown()
|