fix(tests): peer-exchange interop (#1773)

* fix(tests): px interop

* optimize waitFor utility

* address minor comments

* fix: test refactoring
This commit is contained in:
Danish Arora 2024-01-11 16:39:48 +05:30 committed by GitHub
parent aaa16f3ece
commit dc96074c81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 7 deletions

View File

@ -13,3 +13,4 @@ export * from "./node/node.js";
export * from "./teardown.js"; export * from "./teardown.js";
export * from "./message_collector.js"; export * from "./message_collector.js";
export * from "./utils.js"; export * from "./utils.js";
export * from "./waitForRemotePeerWithCodec.js";

View File

@ -0,0 +1,39 @@
import type { IdentifyResult } from "@libp2p/interface";
import type { PeerId } from "@libp2p/interface/peer-id";
import type { LightNode } from "@waku/interfaces";
/**
* Wait for a remote peer to be identified with a given codec
* @param waku - Waku node
* @param codec - Codec to wait for
* @returns Promise that resolves when the peer is identified
* @internal
* This function is introduced as `core/waitForRemotePeer` only accounts for core protocols like Filter, LightPush & Store
* While this (currently) is not required by the SDK, it is required for the tests
*/
export async function waitForRemotePeerWithCodec(
waku: LightNode,
codec: string,
nodePeerId: PeerId
): Promise<void> {
const connectedPeers = waku.libp2p
.getConnections()
.map((conn) => conn.remotePeer);
if (
connectedPeers.find((connectedPeer) => connectedPeer.equals(nodePeerId))
) {
return;
}
await new Promise<void>((resolve) => {
const cb = (evt: CustomEvent<IdentifyResult>): void => {
if (evt.detail.protocols.includes(codec)) {
waku.libp2p.removeEventListener("peer:identify", cb);
resolve();
}
};
waku.libp2p.addEventListener("peer:identify", cb);
});
return;
}

View File

@ -1,4 +1,6 @@
import type { PeerId } from "@libp2p/interface/peer-id";
import tests from "@libp2p/interface-compliance-tests/peer-discovery"; import tests from "@libp2p/interface-compliance-tests/peer-discovery";
import type { Multiaddr } from "@multiformats/multiaddr";
import type { LightNode, PeerInfo } from "@waku/interfaces"; import type { LightNode, PeerInfo } from "@waku/interfaces";
import { import {
PeerExchangeCodec, PeerExchangeCodec,
@ -9,7 +11,7 @@ import { createLightNode, Libp2pComponents } from "@waku/sdk";
import { expect } from "chai"; import { expect } from "chai";
import { delay } from "../src/delay.js"; import { delay } from "../src/delay.js";
import { tearDownNodes } from "../src/index.js"; import { tearDownNodes, waitForRemotePeerWithCodec } from "../src/index.js";
import { makeLogFileName } from "../src/log_file.js"; import { makeLogFileName } from "../src/log_file.js";
import { NimGoNode } from "../src/node/node.js"; import { NimGoNode } from "../src/node/node.js";
@ -48,11 +50,13 @@ describe("Peer Exchange", () => {
}); });
const nwaku1PeerId = await nwaku1.getPeerId(); const nwaku1PeerId = await nwaku1.getPeerId();
const nwaku2PeerId = await nwaku2.getPeerId();
const nwaku2Ma = await nwaku2.getMultiaddrWithId(); const nwaku2Ma = await nwaku2.getMultiaddrWithId();
waku = await createLightNode(); waku = await createLightNode();
await waku.start(); await waku.start();
await waku.libp2p.dialProtocol(nwaku2Ma, PeerExchangeCodec); await waku.libp2p.dialProtocol(nwaku2Ma, PeerExchangeCodec);
await waitForRemotePeerWithCodec(waku, PeerExchangeCodec, nwaku2PeerId);
const components = waku.libp2p.components as unknown as Libp2pComponents; const components = waku.libp2p.components as unknown as Libp2pComponents;
const peerExchange = new WakuPeerExchange(components); const peerExchange = new WakuPeerExchange(components);
@ -62,6 +66,7 @@ describe("Peer Exchange", () => {
let peerInfos: PeerInfo[] = []; let peerInfos: PeerInfo[] = [];
while (peerInfos.length <= 0) { while (peerInfos.length <= 0) {
peerInfos = (await peerExchange.query({ peerInfos = (await peerExchange.query({
peerId: nwaku2PeerId,
numPeers: numPeersToRequest numPeers: numPeersToRequest
})) as PeerInfo[]; })) as PeerInfo[];
await delay(3000); await delay(3000);
@ -70,16 +75,35 @@ describe("Peer Exchange", () => {
expect(peerInfos.length).to.be.greaterThan(0); expect(peerInfos.length).to.be.greaterThan(0);
expect(peerInfos.length).to.be.lessThanOrEqual(numPeersToRequest); expect(peerInfos.length).to.be.lessThanOrEqual(numPeersToRequest);
expect(peerInfos[0].ENR).to.not.be.null; expect(peerInfos[0].ENR).to.not.be.null;
expect(peerInfos[0].ENR?.peerInfo?.multiaddrs).to.not.be.null;
const doesPeerIdExistInResponse = let foundNodeMultiaddrs: Multiaddr[] = [];
peerInfos.find( let foundNodePeerId: PeerId | undefined = undefined;
({ ENR }) => ENR?.peerInfo?.id.toString() === nwaku1PeerId.toString() const doesPeerIdExistInResponse = peerInfos.some(({ ENR }) => {
) !== undefined; foundNodeMultiaddrs = ENR?.peerInfo?.multiaddrs ?? [];
foundNodePeerId = ENR?.peerInfo?.id;
return ENR?.peerInfo?.id.toString() === nwaku1PeerId.toString();
});
if (!foundNodePeerId) {
throw new Error("Peer ID not found");
}
if (!foundNodePeerId) {
throw new Error("Peer ID not found");
}
expect(doesPeerIdExistInResponse).to.be.equal(true); expect(doesPeerIdExistInResponse).to.be.equal(true);
expect(await waku.libp2p.peerStore.has(await nwaku2.getPeerId())).to.be await waku.libp2p.dialProtocol(foundNodeMultiaddrs, PeerExchangeCodec);
.true; await waitForRemotePeerWithCodec(
waku,
PeerExchangeCodec,
foundNodePeerId
);
expect(await waku.libp2p.peerStore.has(nwaku1PeerId)).to.eq(true);
expect(waku.libp2p.getConnections()).has.length(2);
}); });
}); });