Skip to content

Commit d8419d9

Browse files
feat: nwaku interop test for peer-exchange (#1129)
* handle a breaking edge case - changes interval from static to increasing - handles an edge case which resulted in unwanted return from a function * modularise code & make defaults configurable - breaks the backoff code into a separate function - makes default values configurable - improve interval handling * clean code for checking peer in peerStore * address comments * rename `backoff` to `abort` * add locally run nwaku interop test for peer-exchange * replace `--listen-address` with `--nat:extip` * address improvements
1 parent d8d7b83 commit d8419d9

File tree

3 files changed

+89
-1
lines changed

3 files changed

+89
-1
lines changed

.cspell.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"backoffs",
1212
"bitauth",
1313
"bitjson",
14+
"extip",
1415
"bufbuild",
1516
"chainsafe",
1617
"cimg",

packages/tests/src/nwaku.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export interface Args {
5757
rpcPort?: number;
5858
websocketPort?: number;
5959
discv5BootstrapNode?: string;
60+
discv5UdpPort?: number;
6061
}
6162

6263
export enum LogLevel {
@@ -146,7 +147,7 @@ export class Nwaku {
146147
const startPort = Math.floor(Math.random() * (65535 - 1025) + 1025);
147148

148149
const ports: number[] = await new Promise((resolve, reject) => {
149-
portfinder.getPorts(3, { port: startPort }, (err, ports) => {
150+
portfinder.getPorts(4, { port: startPort }, (err, ports) => {
150151
if (err) reject(err);
151152
resolve(ports);
152153
});
@@ -161,6 +162,7 @@ export class Nwaku {
161162
tcpPort: ports[1],
162163
rpcPort: this.rpcPort,
163164
websocketPort: ports[2],
165+
...(args?.peerExchange && { discv5UdpPort: ports[3] }),
164166
},
165167
args
166168
);
@@ -171,6 +173,9 @@ export class Nwaku {
171173

172174
const argsArray = argsToArray(mergedArgs);
173175

176+
const natExtIp = "--nat:extip:127.0.0.1";
177+
argsArray.push(natExtIp);
178+
174179
if (WAKU_SERVICE_NODE_PARAMS) {
175180
argsArray.push(WAKU_SERVICE_NODE_PARAMS);
176181
}

packages/tests/tests/peer_exchange.node.spec.ts

+82
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { wakuPeerExchangeDiscovery } from "@waku/peer-exchange";
1111
import { expect } from "chai";
1212

1313
import { delay } from "../src/delay.js";
14+
import { makeLogFileName } from "../src/log_file.js";
15+
import { Nwaku } from "../src/nwaku.js";
1416

1517
describe("Peer Exchange", () => {
1618
let waku: LightNode;
@@ -84,4 +86,84 @@ describe("Peer Exchange", () => {
8486

8587
expect(receivedCallback).to.be.true;
8688
});
89+
90+
describe("Locally run nodes", () => {
91+
let waku: LightNode;
92+
let nwaku1: Nwaku;
93+
let nwaku2: Nwaku;
94+
95+
beforeEach(async function () {
96+
nwaku1 = new Nwaku(makeLogFileName(this) + "1");
97+
nwaku2 = new Nwaku(makeLogFileName(this) + "2");
98+
});
99+
100+
afterEach(async function () {
101+
!!nwaku1 && nwaku1.stop();
102+
!!nwaku2 && nwaku2.stop();
103+
!!waku && waku.stop().catch((e) => console.log("Waku failed to stop", e));
104+
});
105+
106+
it("nwaku interop", async function () {
107+
this.timeout(25_000);
108+
109+
await nwaku1.start({
110+
discv5Discovery: true,
111+
peerExchange: true,
112+
});
113+
114+
const enr = (await nwaku1.info()).enrUri;
115+
116+
await nwaku2.start({
117+
discv5Discovery: true,
118+
peerExchange: true,
119+
discv5BootstrapNode: enr,
120+
});
121+
122+
const nwaku1Ma = await nwaku1.getMultiaddrWithId();
123+
const nwaku2Ma = await nwaku2.getMultiaddrWithId();
124+
125+
waku = await createLightNode();
126+
await waku.start();
127+
await waku.dial(nwaku2Ma);
128+
129+
await waitForRemotePeer(waku, [Protocols.PeerExchange]);
130+
131+
await nwaku2.waitForLog("Discovered px peers via discv5", 1);
132+
133+
let receivedCallback = false;
134+
135+
const numPeersToRequest = 1;
136+
const callback = async (
137+
response: PeerExchangeResponse
138+
): Promise<void> => {
139+
const doesMultiaddrExist = response.peerInfos.find(
140+
(peerInfo) =>
141+
peerInfo.ENR?.getFullMultiaddrs()?.find((multiaddr) =>
142+
multiaddr.equals(nwaku1Ma)
143+
) !== undefined
144+
);
145+
146+
expect(response.peerInfos.length).to.be.greaterThan(0);
147+
expect(response.peerInfos.length).to.be.lessThanOrEqual(
148+
numPeersToRequest
149+
);
150+
expect(response.peerInfos[0].ENR).to.not.be.null;
151+
152+
expect(doesMultiaddrExist).to.be.equal(true);
153+
154+
expect(waku.libp2p.peerStore.has(await nwaku2.getPeerId())).to.be.true;
155+
156+
receivedCallback = true;
157+
};
158+
159+
await waku.peerExchange.query(
160+
{
161+
numPeers: numPeersToRequest,
162+
},
163+
callback
164+
);
165+
166+
expect(receivedCallback).to.be.true;
167+
});
168+
});
87169
});

0 commit comments

Comments
 (0)