2025-05-26 21:58:02 +02:00
|
|
|
import chronicles, std/[options, tables, strutils], chronos, testutils/unittests
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
import
|
2024-07-06 03:33:38 +05:30
|
|
|
waku/node/waku_node,
|
|
|
|
|
waku/waku_core,
|
2024-03-19 16:18:52 +01:00
|
|
|
../../waku_lightpush/[lightpush_utils],
|
|
|
|
|
../../testlib/[wakucore, wakunode, futures, testasync],
|
2024-07-06 03:33:38 +05:30
|
|
|
waku/node/peer_manager/peer_manager
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
suite "Peer Manager":
|
|
|
|
|
suite "onPeerMetadata":
|
|
|
|
|
var
|
|
|
|
|
listenPort {.threadvar.}: Port
|
|
|
|
|
listenAddress {.threadvar.}: IpAddress
|
|
|
|
|
serverKey {.threadvar.}: PrivateKey
|
|
|
|
|
clientKey {.threadvar.}: PrivateKey
|
|
|
|
|
clusterId {.threadvar.}: uint64
|
|
|
|
|
|
|
|
|
|
asyncSetup:
|
|
|
|
|
listenPort = Port(0)
|
2025-05-26 21:58:02 +02:00
|
|
|
listenAddress = parseIpAddress("0.0.0.0")
|
2024-03-19 16:18:52 +01:00
|
|
|
serverKey = generateSecp256k1Key()
|
|
|
|
|
clientKey = generateSecp256k1Key()
|
|
|
|
|
clusterId = 1
|
|
|
|
|
|
|
|
|
|
asyncTest "light client is not disconnected":
|
|
|
|
|
# Given two nodes with the same shardId
|
|
|
|
|
let
|
2024-05-10 14:13:58 +02:00
|
|
|
server = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
serverKey, listenAddress, listenPort, clusterId = clusterId, shards = @[0]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
|
|
|
|
client = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
clientKey, listenAddress, listenPort, clusterId = clusterId, shards = @[1]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
# And both mount metadata and filter
|
2025-08-13 10:48:56 +05:30
|
|
|
discard
|
|
|
|
|
client.mountMetadata(0, @[1'u16]) # clusterId irrelevant, overridden by topic
|
|
|
|
|
discard
|
|
|
|
|
server.mountMetadata(0, @[0'u16]) # clusterId irrelevant, overridden by topic
|
2024-03-19 16:18:52 +01:00
|
|
|
await client.mountFilterClient()
|
|
|
|
|
await server.mountFilter()
|
|
|
|
|
|
|
|
|
|
# And both nodes are started
|
2024-05-10 14:13:58 +02:00
|
|
|
await allFutures(server.start(), client.start())
|
2024-03-19 16:18:52 +01:00
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# And the nodes are connected
|
|
|
|
|
let serverRemotePeerInfo = server.switch.peerInfo.toRemotePeerInfo()
|
|
|
|
|
await client.connectToNodes(@[serverRemotePeerInfo])
|
|
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# When making an operation that triggers onPeerMetadata
|
|
|
|
|
discard await client.filterSubscribe(
|
2024-07-09 18:36:12 +03:00
|
|
|
some("/waku/2/rs/0/0"), "waku/lightpush/1", serverRemotePeerInfo
|
2024-03-19 16:18:52 +01:00
|
|
|
)
|
|
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
server.switch.isConnected(client.switch.peerInfo.toRemotePeerInfo().peerId)
|
|
|
|
|
client.switch.isConnected(server.switch.peerInfo.toRemotePeerInfo().peerId)
|
|
|
|
|
|
|
|
|
|
asyncTest "relay with same shardId is not disconnected":
|
|
|
|
|
# Given two nodes with the same shardId
|
|
|
|
|
let
|
2024-05-10 14:13:58 +02:00
|
|
|
server = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
serverKey, listenAddress, listenPort, clusterId = clusterId, shards = @[0]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
|
|
|
|
client = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
clientKey, listenAddress, listenPort, clusterId = clusterId, shards = @[1]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
# And both mount metadata and relay
|
2025-08-13 10:48:56 +05:30
|
|
|
discard
|
|
|
|
|
client.mountMetadata(0, @[1'u16]) # clusterId irrelevant, overridden by topic
|
|
|
|
|
discard
|
|
|
|
|
server.mountMetadata(0, @[0'u16]) # clusterId irrelevant, overridden by topic
|
2025-05-05 22:57:20 +02:00
|
|
|
(await client.mountRelay()).isOkOr:
|
|
|
|
|
assert false, "Failed to mount relay"
|
|
|
|
|
(await server.mountRelay()).isOkOr:
|
|
|
|
|
assert false, "Failed to mount relay"
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
# And both nodes are started
|
2024-05-10 14:13:58 +02:00
|
|
|
await allFutures(server.start(), client.start())
|
2024-03-19 16:18:52 +01:00
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# And the nodes are connected
|
|
|
|
|
let serverRemotePeerInfo = server.switch.peerInfo.toRemotePeerInfo()
|
|
|
|
|
await client.connectToNodes(@[serverRemotePeerInfo])
|
|
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# When making an operation that triggers onPeerMetadata
|
2025-05-05 22:57:20 +02:00
|
|
|
client.subscribe((kind: SubscriptionKind.PubsubSub, topic: "newTopic")).isOkOr:
|
|
|
|
|
assert false, "Failed to subscribe to relay"
|
2024-03-19 16:18:52 +01:00
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
server.switch.isConnected(client.switch.peerInfo.toRemotePeerInfo().peerId)
|
|
|
|
|
client.switch.isConnected(server.switch.peerInfo.toRemotePeerInfo().peerId)
|
|
|
|
|
|
|
|
|
|
asyncTest "relay with different shardId is disconnected":
|
|
|
|
|
# Given two nodes with different shardIds
|
|
|
|
|
let
|
2024-05-10 14:13:58 +02:00
|
|
|
server = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
serverKey, listenAddress, listenPort, clusterId = clusterId, shards = @[0]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
|
|
|
|
client = newTestWakuNode(
|
2024-09-10 15:07:12 -06:00
|
|
|
clientKey, listenAddress, listenPort, clusterId = clusterId, shards = @[1]
|
2024-05-10 14:13:58 +02:00
|
|
|
)
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
# And both mount metadata and relay
|
2025-08-13 10:48:56 +05:30
|
|
|
discard
|
|
|
|
|
client.mountMetadata(0, @[1'u16]) # clusterId irrelevant, overridden by topic
|
|
|
|
|
discard
|
|
|
|
|
server.mountMetadata(0, @[0'u16]) # clusterId irrelevant, overridden by topic
|
2025-05-05 22:57:20 +02:00
|
|
|
(await client.mountRelay()).isOkOr:
|
|
|
|
|
assert false, "Failed to mount relay"
|
|
|
|
|
(await server.mountRelay()).isOkOr:
|
|
|
|
|
assert false, "Failed to mount relay"
|
2024-03-19 16:18:52 +01:00
|
|
|
|
|
|
|
|
# And both nodes are started
|
2024-05-10 14:13:58 +02:00
|
|
|
await allFutures(server.start(), client.start())
|
2024-03-19 16:18:52 +01:00
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# And the nodes are connected
|
|
|
|
|
let serverRemotePeerInfo = server.switch.peerInfo.toRemotePeerInfo()
|
|
|
|
|
await client.connectToNodes(@[serverRemotePeerInfo])
|
|
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
# When making an operation that triggers onPeerMetadata
|
2025-05-05 22:57:20 +02:00
|
|
|
client.subscribe((kind: SubscriptionKind.PubsubSub, topic: "newTopic")).isOkOr:
|
|
|
|
|
assert false, "Failed to subscribe to relay"
|
2024-03-19 16:18:52 +01:00
|
|
|
await sleepAsync(FUTURE_TIMEOUT)
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
not server.switch.isConnected(client.switch.peerInfo.toRemotePeerInfo().peerId)
|
|
|
|
|
not client.switch.isConnected(server.switch.peerInfo.toRemotePeerInfo().peerId)
|