2021-03-23 10:04:51 +02:00
|
|
|
|
{.used.}
|
|
|
|
|
|
2021-02-04 12:32:58 +02:00
|
|
|
|
import
|
2022-11-04 10:52:08 +01:00
|
|
|
|
std/[options, sequtils],
|
2022-10-28 20:13:41 +02:00
|
|
|
|
stew/shims/net as stewNet,
|
|
|
|
|
testutils/unittests,
|
2022-11-22 08:13:51 +01:00
|
|
|
|
chronicles,
|
2022-11-24 14:11:23 +01:00
|
|
|
|
chronos,
|
2022-11-04 10:52:08 +01:00
|
|
|
|
json_rpc/rpcserver,
|
|
|
|
|
json_rpc/rpcclient,
|
2022-10-28 20:13:41 +02:00
|
|
|
|
eth/keys,
|
|
|
|
|
eth/common/eth_types,
|
2021-06-09 16:37:08 +02:00
|
|
|
|
libp2p/[builders, switch, multiaddress],
|
2021-02-04 12:32:58 +02:00
|
|
|
|
libp2p/protobuf/minprotobuf,
|
|
|
|
|
libp2p/stream/[bufferstream, connection],
|
|
|
|
|
libp2p/crypto/crypto,
|
|
|
|
|
libp2p/protocols/pubsub/pubsub,
|
2022-08-05 17:05:17 +02:00
|
|
|
|
libp2p/protocols/pubsub/rpc/message
|
|
|
|
|
import
|
2022-10-28 20:13:41 +02:00
|
|
|
|
../../waku/common/sqlite,
|
|
|
|
|
../../waku/v2/node/peer_manager/peer_manager,
|
2022-11-04 09:40:13 +01:00
|
|
|
|
../../waku/v2/node/peer_manager/peer_store/waku_peer_storage,
|
2022-10-28 20:13:41 +02:00
|
|
|
|
../../waku/v2/node/waku_node,
|
2022-09-06 21:07:37 +02:00
|
|
|
|
../../waku/v2/protocol/waku_relay,
|
2022-08-05 17:05:17 +02:00
|
|
|
|
../../waku/v2/protocol/waku_store,
|
2022-08-05 16:38:00 +02:00
|
|
|
|
../../waku/v2/protocol/waku_filter,
|
2022-09-06 20:36:53 +02:00
|
|
|
|
../../waku/v2/protocol/waku_swap/waku_swap,
|
2022-11-24 14:11:23 +01:00
|
|
|
|
../test_helpers,
|
|
|
|
|
./testlib/testutils
|
2021-02-04 12:32:58 +02:00
|
|
|
|
|
|
|
|
|
procSuite "Peer Manager":
|
2021-02-05 12:49:11 +02:00
|
|
|
|
asyncTest "Peer dialing works":
|
2021-02-04 12:32:58 +02:00
|
|
|
|
let
|
|
|
|
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60800))
|
2021-02-04 12:32:58 +02:00
|
|
|
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60802))
|
2022-01-10 16:07:35 +01:00
|
|
|
|
peerInfo2 = node2.switch.peerInfo
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-04 12:32:58 +02:00
|
|
|
|
await allFutures([node1.start(), node2.start()])
|
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node1.mountRelay()
|
|
|
|
|
await node2.mountRelay()
|
2021-02-04 12:32:58 +02:00
|
|
|
|
|
|
|
|
|
# Dial node2 from node1
|
2021-10-06 14:29:08 +02:00
|
|
|
|
let conn = (await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec)).get()
|
2021-02-04 12:32:58 +02:00
|
|
|
|
|
|
|
|
|
# Check connection
|
|
|
|
|
check:
|
|
|
|
|
conn.activity
|
2021-10-06 14:29:08 +02:00
|
|
|
|
conn.peerId == peerInfo2.peerId
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-04 12:32:58 +02:00
|
|
|
|
# Check that node2 is being managed in node1
|
|
|
|
|
check:
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
2021-02-04 12:32:58 +02:00
|
|
|
|
|
|
|
|
|
# Check connectedness
|
|
|
|
|
check:
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connectedness.Connected
|
|
|
|
|
|
2021-02-05 12:49:11 +02:00
|
|
|
|
await allFutures([node1.stop(), node2.stop()])
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-05 12:49:11 +02:00
|
|
|
|
asyncTest "Dialing fails gracefully":
|
|
|
|
|
let
|
|
|
|
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60810))
|
2021-02-05 12:49:11 +02:00
|
|
|
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60812))
|
2022-01-10 16:07:35 +01:00
|
|
|
|
peerInfo2 = node2.switch.peerInfo
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-05 12:49:11 +02:00
|
|
|
|
await node1.start()
|
|
|
|
|
# Purposefully don't start node2
|
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node1.mountRelay()
|
|
|
|
|
await node2.mountRelay()
|
2021-02-04 12:32:58 +02:00
|
|
|
|
|
2021-02-05 12:49:11 +02:00
|
|
|
|
# Dial node2 from node1
|
2021-10-06 14:29:08 +02:00
|
|
|
|
let connOpt = await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec, 2.seconds)
|
2021-02-05 12:49:11 +02:00
|
|
|
|
|
|
|
|
|
# Check connection failed gracefully
|
|
|
|
|
check:
|
|
|
|
|
connOpt.isNone()
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-05 12:49:11 +02:00
|
|
|
|
await node1.stop()
|
2021-02-11 10:58:25 +02:00
|
|
|
|
|
|
|
|
|
asyncTest "Adding, selecting and filtering peers work":
|
|
|
|
|
let
|
|
|
|
|
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"), Port(60820))
|
2021-02-11 10:58:25 +02:00
|
|
|
|
# Create filter peer
|
|
|
|
|
filterLoc = MultiAddress.init("/ip4/127.0.0.1/tcp/0").tryGet()
|
2022-10-18 09:05:53 -05:00
|
|
|
|
filterKey = crypto.PrivateKey.random(ECDSA, rng[]).get()
|
2021-11-04 15:46:38 +01:00
|
|
|
|
filterPeer = PeerInfo.new(filterKey, @[filterLoc])
|
2021-02-11 10:58:25 +02:00
|
|
|
|
# Create swap peer
|
|
|
|
|
swapLoc = MultiAddress.init("/ip4/127.0.0.2/tcp/2").tryGet()
|
2022-10-18 09:05:53 -05:00
|
|
|
|
swapKey = crypto.PrivateKey.random(ECDSA, rng[]).get()
|
2021-11-04 15:46:38 +01:00
|
|
|
|
swapPeer = PeerInfo.new(swapKey, @[swapLoc])
|
2021-02-11 10:58:25 +02:00
|
|
|
|
# Create store peer
|
|
|
|
|
storeLoc = MultiAddress.init("/ip4/127.0.0.3/tcp/4").tryGet()
|
2022-10-18 09:05:53 -05:00
|
|
|
|
storeKey = crypto.PrivateKey.random(ECDSA, rng[]).get()
|
2021-11-04 15:46:38 +01:00
|
|
|
|
storePeer = PeerInfo.new(storeKey, @[storeLoc])
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-11 10:58:25 +02:00
|
|
|
|
await node.start()
|
|
|
|
|
|
2022-11-02 11:59:58 +01:00
|
|
|
|
await node.mountFilterClient()
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node.mountSwap()
|
2022-10-28 20:11:28 +02:00
|
|
|
|
node.mountStoreClient()
|
2021-02-11 10:58:25 +02:00
|
|
|
|
|
2021-10-06 14:29:08 +02:00
|
|
|
|
node.wakuSwap.setPeer(swapPeer.toRemotePeerInfo())
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2022-10-28 20:11:28 +02:00
|
|
|
|
node.setStorePeer(storePeer.toRemotePeerInfo())
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node.setFilterPeer(filterPeer.toRemotePeerInfo())
|
2021-02-11 10:58:25 +02:00
|
|
|
|
|
|
|
|
|
# Check peers were successfully added to peer manager
|
|
|
|
|
check:
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node.peerManager.peerStore.peers().len == 3
|
|
|
|
|
node.peerManager.peerStore.peers(WakuFilterCodec).allIt(it.peerId == filterPeer.peerId and
|
|
|
|
|
it.addrs.contains(filterLoc) and
|
|
|
|
|
it.protos.contains(WakuFilterCodec))
|
|
|
|
|
node.peerManager.peerStore.peers(WakuSwapCodec).allIt(it.peerId == swapPeer.peerId and
|
|
|
|
|
it.addrs.contains(swapLoc) and
|
|
|
|
|
it.protos.contains(WakuSwapCodec))
|
|
|
|
|
node.peerManager.peerStore.peers(WakuStoreCodec).allIt(it.peerId == storePeer.peerId and
|
|
|
|
|
it.addrs.contains(storeLoc) and
|
|
|
|
|
it.protos.contains(WakuStoreCodec))
|
|
|
|
|
|
2021-02-11 10:58:25 +02:00
|
|
|
|
await node.stop()
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-12 10:53:52 +02:00
|
|
|
|
|
|
|
|
|
asyncTest "Peer manager keeps track of connections":
|
|
|
|
|
let
|
|
|
|
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60830))
|
2021-02-12 10:53:52 +02:00
|
|
|
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60832))
|
2022-01-10 16:07:35 +01:00
|
|
|
|
peerInfo2 = node2.switch.peerInfo
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-02-12 10:53:52 +02:00
|
|
|
|
await node1.start()
|
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node1.mountRelay()
|
|
|
|
|
await node2.mountRelay()
|
2021-02-12 10:53:52 +02:00
|
|
|
|
|
|
|
|
|
# Test default connectedness for new peers
|
2021-10-06 14:29:08 +02:00
|
|
|
|
node1.peerManager.addPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec)
|
2021-02-12 10:53:52 +02:00
|
|
|
|
check:
|
|
|
|
|
# No information about node2's connectedness
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == NotConnected
|
2021-02-12 10:53:52 +02:00
|
|
|
|
|
|
|
|
|
# Purposefully don't start node2
|
|
|
|
|
# Attempt dialing node2 from node1
|
2021-10-06 14:29:08 +02:00
|
|
|
|
discard await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec, 2.seconds)
|
2021-02-12 10:53:52 +02:00
|
|
|
|
check:
|
|
|
|
|
# Cannot connect to node2
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == CannotConnect
|
2021-02-12 10:53:52 +02:00
|
|
|
|
|
|
|
|
|
# Successful connection
|
|
|
|
|
await node2.start()
|
2021-10-06 14:29:08 +02:00
|
|
|
|
discard await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec, 2.seconds)
|
2021-02-12 10:53:52 +02:00
|
|
|
|
check:
|
|
|
|
|
# Currently connected to node2
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connected
|
2021-02-12 10:53:52 +02:00
|
|
|
|
|
|
|
|
|
# Stop node. Gracefully disconnect from all peers.
|
|
|
|
|
await node1.stop()
|
|
|
|
|
check:
|
|
|
|
|
# Not currently connected to node2, but had recent, successful connection.
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == CanConnect
|
|
|
|
|
|
2021-03-26 10:49:51 +02:00
|
|
|
|
await node2.stop()
|
|
|
|
|
|
|
|
|
|
asyncTest "Peer manager can use persistent storage and survive restarts":
|
|
|
|
|
let
|
2022-10-28 20:13:41 +02:00
|
|
|
|
database = SqliteDatabase.new(":memory:")[]
|
2021-03-26 10:49:51 +02:00
|
|
|
|
storage = WakuPeerStorage.new(database)[]
|
|
|
|
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60840), peerStorage = storage)
|
2021-03-26 10:49:51 +02:00
|
|
|
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60842))
|
2022-01-10 16:07:35 +01:00
|
|
|
|
peerInfo2 = node2.switch.peerInfo
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-03-26 10:49:51 +02:00
|
|
|
|
await node1.start()
|
|
|
|
|
await node2.start()
|
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node1.mountRelay()
|
|
|
|
|
await node2.mountRelay()
|
2021-03-26 10:49:51 +02:00
|
|
|
|
|
2021-10-06 14:29:08 +02:00
|
|
|
|
discard await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), WakuRelayCodec, 2.seconds)
|
2021-03-26 10:49:51 +02:00
|
|
|
|
check:
|
|
|
|
|
# Currently connected to node2
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node1.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connected
|
2021-03-26 10:49:51 +02:00
|
|
|
|
|
|
|
|
|
# Simulate restart by initialising a new node using the same storage
|
|
|
|
|
let
|
|
|
|
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60844), peerStorage = storage)
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-03-26 10:49:51 +02:00
|
|
|
|
await node3.start()
|
|
|
|
|
check:
|
|
|
|
|
# Node2 has been loaded after "restart", but we have not yet reconnected
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node3.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node3.peerManager.peerStore.connectedness(peerInfo2.peerId) == NotConnected
|
2021-03-26 10:49:51 +02:00
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node3.mountRelay() # This should trigger a reconnect
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-03-26 10:49:51 +02:00
|
|
|
|
check:
|
|
|
|
|
# Reconnected to node2 after "restart"
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node3.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node3.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connected
|
|
|
|
|
|
2021-03-26 10:49:51 +02:00
|
|
|
|
await allFutures([node1.stop(), node2.stop(), node3.stop()])
|
2021-07-27 08:48:56 +02:00
|
|
|
|
|
2022-11-24 14:11:23 +01:00
|
|
|
|
# TODO: nwaku/issues/1377
|
|
|
|
|
xasyncTest "Peer manager support multiple protocol IDs when reconnecting to peers":
|
2021-07-27 08:48:56 +02:00
|
|
|
|
let
|
2022-10-28 20:13:41 +02:00
|
|
|
|
database = SqliteDatabase.new(":memory:")[]
|
2021-07-27 08:48:56 +02:00
|
|
|
|
storage = WakuPeerStorage.new(database)[]
|
|
|
|
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60850), peerStorage = storage)
|
2021-07-27 08:48:56 +02:00
|
|
|
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60852))
|
2022-01-10 16:07:35 +01:00
|
|
|
|
peerInfo2 = node2.switch.peerInfo
|
2021-07-27 08:48:56 +02:00
|
|
|
|
betaCodec = "/vac/waku/relay/2.0.0-beta2"
|
|
|
|
|
stableCodec = "/vac/waku/relay/2.0.0"
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2021-07-27 08:48:56 +02:00
|
|
|
|
await node1.start()
|
|
|
|
|
await node2.start()
|
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node1.mountRelay()
|
2021-07-27 08:48:56 +02:00
|
|
|
|
node1.wakuRelay.codec = betaCodec
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node2.mountRelay()
|
2021-07-27 08:48:56 +02:00
|
|
|
|
node2.wakuRelay.codec = betaCodec
|
|
|
|
|
|
2021-10-06 14:29:08 +02:00
|
|
|
|
discard await node1.peerManager.dialPeer(peerInfo2.toRemotePeerInfo(), node2.wakuRelay.codec, 2.seconds)
|
2021-07-27 08:48:56 +02:00
|
|
|
|
check:
|
|
|
|
|
# Currently connected to node2
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node1.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node1.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node1.peerManager.peerStore.peers().anyIt(it.protos.contains(node2.wakuRelay.codec))
|
|
|
|
|
node1.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connected
|
2021-07-27 08:48:56 +02:00
|
|
|
|
|
|
|
|
|
# Simulate restart by initialising a new node using the same storage
|
|
|
|
|
let
|
|
|
|
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
2022-11-02 11:59:58 +01:00
|
|
|
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60854), peerStorage = storage)
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
2022-09-07 16:31:27 +01:00
|
|
|
|
await node3.mountRelay()
|
2021-07-27 08:48:56 +02:00
|
|
|
|
node3.wakuRelay.codec = stableCodec
|
|
|
|
|
check:
|
|
|
|
|
# Node 2 and 3 have differing codecs
|
|
|
|
|
node2.wakuRelay.codec == betaCodec
|
|
|
|
|
node3.wakuRelay.codec == stableCodec
|
|
|
|
|
# Node2 has been loaded after "restart", but we have not yet reconnected
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node3.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.protos.contains(betaCodec))
|
|
|
|
|
node3.peerManager.peerStore.connectedness(peerInfo2.peerId) == NotConnected
|
|
|
|
|
|
2021-07-27 08:48:56 +02:00
|
|
|
|
await node3.start() # This should trigger a reconnect
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
# Reconnected to node2 after "restart"
|
2022-11-24 14:11:23 +01:00
|
|
|
|
node3.peerManager.peerStore.peers().len == 1
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.peerId == peerInfo2.peerId)
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.protos.contains(betaCodec))
|
|
|
|
|
node3.peerManager.peerStore.peers().anyIt(it.protos.contains(stableCodec))
|
|
|
|
|
node3.peerManager.peerStore.connectedness(peerInfo2.peerId) == Connected
|
|
|
|
|
|
2021-07-27 08:48:56 +02:00
|
|
|
|
await allFutures([node1.stop(), node2.stop(), node3.stop()])
|
2022-11-24 14:11:23 +01:00
|
|
|
|
|
|
|
|
|
asyncTest "Peer manager connects to all peers supporting a given protocol":
|
|
|
|
|
# Create 4 nodes
|
|
|
|
|
var nodes: seq[WakuNode]
|
|
|
|
|
for i in 0..<4:
|
|
|
|
|
let nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
|
|
|
|
let node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"), Port(60860 + i))
|
|
|
|
|
nodes &= node
|
|
|
|
|
|
|
|
|
|
# Start them
|
|
|
|
|
await allFutures(nodes.mapIt(it.start()))
|
|
|
|
|
await allFutures(nodes.mapIt(it.mountRelay()))
|
|
|
|
|
|
|
|
|
|
# Get all peer infos
|
|
|
|
|
let peerInfos = nodes.mapIt(it.switch.peerInfo.toRemotePeerInfo())
|
|
|
|
|
|
|
|
|
|
# Add all peers (but self) to node 0
|
|
|
|
|
nodes[0].peerManager.addPeer(peerInfos[1], WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.addPeer(peerInfos[2], WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.addPeer(peerInfos[3], WakuRelayCodec)
|
|
|
|
|
|
|
|
|
|
# Attempt to connect to all known peers supporting a given protocol
|
|
|
|
|
await nodes[0].peerManager.reconnectPeers(WakuRelayCodec, protocolMatcher(WakuRelayCodec))
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
# Peerstore track all three peers
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().len == 3
|
|
|
|
|
|
|
|
|
|
# All peer ids are correct
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[1].switch.peerInfo.peerId)
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[2].switch.peerInfo.peerId)
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[3].switch.peerInfo.peerId)
|
|
|
|
|
|
|
|
|
|
# All peers support the relay protocol
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[1].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[2].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[3].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
|
|
|
|
|
# All peers are connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[1].switch.peerInfo.peerId] == Connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[2].switch.peerInfo.peerId] == Connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[3].switch.peerInfo.peerId] == Connected
|
|
|
|
|
|
|
|
|
|
await allFutures(nodes.mapIt(it.stop()))
|
2022-11-29 17:35:25 +01:00
|
|
|
|
|
|
|
|
|
asyncTest "Peer store keeps track of incoming connections":
|
|
|
|
|
# Create 4 nodes
|
|
|
|
|
var nodes: seq[WakuNode]
|
|
|
|
|
for i in 0..<4:
|
|
|
|
|
let nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
|
|
|
|
let node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"), Port(60865 + i))
|
|
|
|
|
nodes &= node
|
|
|
|
|
|
|
|
|
|
# Start them
|
|
|
|
|
await allFutures(nodes.mapIt(it.start()))
|
|
|
|
|
await allFutures(nodes.mapIt(it.mountRelay()))
|
|
|
|
|
|
|
|
|
|
# Get all peer infos
|
|
|
|
|
let peerInfos = nodes.mapIt(it.switch.peerInfo.toRemotePeerInfo())
|
|
|
|
|
|
|
|
|
|
# all nodes connect to peer 0
|
|
|
|
|
discard await nodes[1].peerManager.dialPeer(peerInfos[0], WakuRelayCodec, 2.seconds)
|
|
|
|
|
discard await nodes[2].peerManager.dialPeer(peerInfos[0], WakuRelayCodec, 2.seconds)
|
|
|
|
|
discard await nodes[3].peerManager.dialPeer(peerInfos[0], WakuRelayCodec, 2.seconds)
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
# Peerstore track all three peers
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().len == 3
|
|
|
|
|
|
|
|
|
|
# Inbound/Outbound number of peers match
|
|
|
|
|
nodes[0].peerManager.peerStore.getPeersByDirection(Inbound).len == 3
|
|
|
|
|
nodes[0].peerManager.peerStore.getPeersByDirection(Outbound).len == 0
|
|
|
|
|
nodes[1].peerManager.peerStore.getPeersByDirection(Inbound).len == 0
|
|
|
|
|
nodes[1].peerManager.peerStore.getPeersByDirection(Outbound).len == 1
|
|
|
|
|
nodes[2].peerManager.peerStore.getPeersByDirection(Inbound).len == 0
|
|
|
|
|
nodes[2].peerManager.peerStore.getPeersByDirection(Outbound).len == 1
|
|
|
|
|
nodes[3].peerManager.peerStore.getPeersByDirection(Inbound).len == 0
|
|
|
|
|
nodes[3].peerManager.peerStore.getPeersByDirection(Outbound).len == 1
|
|
|
|
|
|
|
|
|
|
# All peer ids are correct
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[1].switch.peerInfo.peerId)
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[2].switch.peerInfo.peerId)
|
|
|
|
|
nodes[0].peerManager.peerStore.peers().anyIt(it.peerId == nodes[3].switch.peerInfo.peerId)
|
|
|
|
|
|
|
|
|
|
# All peers support the relay protocol
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[1].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[2].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
nodes[0].peerManager.peerStore[ProtoBook][nodes[3].switch.peerInfo.peerId].contains(WakuRelayCodec)
|
|
|
|
|
|
|
|
|
|
# All peers are connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[1].switch.peerInfo.peerId] == Connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[2].switch.peerInfo.peerId] == Connected
|
|
|
|
|
nodes[0].peerManager.peerStore[ConnectionBook][nodes[3].switch.peerInfo.peerId] == Connected
|
|
|
|
|
|
|
|
|
|
# All peers are Inbound in peer 0
|
|
|
|
|
nodes[0].peerManager.peerStore[DirectionBook][nodes[1].switch.peerInfo.peerId] == Inbound
|
|
|
|
|
nodes[0].peerManager.peerStore[DirectionBook][nodes[2].switch.peerInfo.peerId] == Inbound
|
|
|
|
|
nodes[0].peerManager.peerStore[DirectionBook][nodes[3].switch.peerInfo.peerId] == Inbound
|
|
|
|
|
|
|
|
|
|
# All peers have an Outbound connection with peer 0
|
|
|
|
|
nodes[1].peerManager.peerStore[DirectionBook][nodes[0].switch.peerInfo.peerId] == Outbound
|
|
|
|
|
nodes[2].peerManager.peerStore[DirectionBook][nodes[0].switch.peerInfo.peerId] == Outbound
|
|
|
|
|
nodes[3].peerManager.peerStore[DirectionBook][nodes[0].switch.peerInfo.peerId] == Outbound
|
|
|
|
|
|
|
|
|
|
await allFutures(nodes.mapIt(it.stop()))
|