fix: failing px tests for nwaku master (#1355)

* move dockerode into a separate class

* rename `nwaku` to `WakuNode` to generalise
- nwaku and go-waku were running through
`nwaku.ts`

* move wakunode and docker into one subdir

* rename node to `NimGoNode` and update imports in tests

* update docker to host all containers in a specific network

* update the peer exchange test

* assign static IPs to containers

* enable relay on px interop

* fix px compliance tests

* fix import
This commit is contained in:
Danish Arora 2023-05-19 01:28:49 +05:30 committed by GitHub
parent 123eabec95
commit d80042fc47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 407 additions and 280 deletions

View File

@ -11,7 +11,6 @@
"backoffs",
"bitauth",
"bitjson",
"extip",
"bufbuild",
"chainsafe",
"cimg",
@ -25,6 +24,7 @@
"discv",
"Dlazy",
"dnsaddr",
"Dockerode",
"Dout",
"Dscore",
"ecies",
@ -37,6 +37,7 @@
"ethersproject",
"execa",
"exponentiate",
"extip",
"fanout",
"floodsub",
"fontsource",
@ -47,6 +48,7 @@
"ihave",
"ihaves",
"ineed",
"IPAM",
"ipfs",
"iwant",
"jdev",
@ -93,6 +95,7 @@
"sscanf",
"staticnode",
"statusim",
"statusteam",
"submodule",
"submodules",
"supercrypto",
@ -114,8 +117,7 @@
"webfonts",
"websockets",
"wifi",
"xsalsa20",
"statusteam"
"xsalsa20"
],
"flagWords": [],
"ignorePaths": [

View File

@ -9,5 +9,4 @@ export * from "./async_fs.js";
export * from "./constants.js";
export * from "./delay.js";
export * from "./log_file.js";
export * from "./nwaku.js";
export * from "./random_array.js";
export * from "./node/nwaku.js";

View File

@ -0,0 +1,215 @@
import fs from "fs";
import debug from "debug";
import Docker from "dockerode";
import { Args } from "./interfaces.js";
const log = debug("waku:docker");
const NETWORK_NAME = "waku";
const SUBNET = "172.18.0.0/16";
const IP_RANGE = "172.18.0.0/24";
const GATEWAY = "172.18.0.1";
export default class Dockerode {
public docker: Docker;
private readonly IMAGE_NAME: string;
public containerId?: string;
private static network: Docker.Network;
private static lastUsedIp = "172.18.0.1";
private containerIp: string;
private constructor(imageName: string, containerIp: string) {
this.docker = new Docker();
this.IMAGE_NAME = imageName;
this.containerIp = containerIp;
}
public static async createInstance(imageName: string): Promise<Dockerode> {
if (!Dockerode.network) {
Dockerode.network = await Dockerode.createNetwork(NETWORK_NAME);
}
const instance = new Dockerode(imageName, Dockerode.getNextIp());
return instance;
}
private static async createNetwork(
networkName: string = NETWORK_NAME
): Promise<Docker.Network> {
const docker = new Docker();
const networks = await docker.listNetworks();
const existingNetwork = networks.find(
(network) => network.Name === networkName
);
let network: Docker.Network;
if (existingNetwork) {
network = docker.getNetwork(existingNetwork.Id);
} else {
network = await docker.createNetwork({
Name: networkName,
Driver: "bridge",
IPAM: {
Driver: "default",
Config: [
{
Subnet: SUBNET,
IPRange: IP_RANGE,
Gateway: GATEWAY,
},
],
},
});
}
return network;
}
private static getNextIp(): string {
const ipFragments = Dockerode.lastUsedIp.split(".");
let lastFragment = Number(ipFragments[3]);
lastFragment++;
if (lastFragment > 254) {
throw new Error("IP Address Range Exhausted");
}
ipFragments[3] = lastFragment.toString();
Dockerode.lastUsedIp = ipFragments.join(".");
return Dockerode.lastUsedIp;
}
get container(): Docker.Container | undefined {
if (!this.containerId) {
return undefined;
}
return this.docker.getContainer(this.containerId);
}
async startContainer(
ports: number[],
args: Args,
logPath: string,
wakuServiceNodeParams?: string
): Promise<Docker.Container> {
const [rpcPort, tcpPort, websocketPort, discv5UdpPort] = ports;
await this.confirmImageExistsOrPull();
const argsArray = argsToArray(args);
if (wakuServiceNodeParams) {
argsArray.push(wakuServiceNodeParams);
}
const argsArrayWithIP = [...argsArray, `--nat=extip:${this.containerIp}`];
log(`Args: ${argsArray.join(" ")}`);
const container = await this.docker.createContainer({
Image: this.IMAGE_NAME,
HostConfig: {
AutoRemove: true,
PortBindings: {
[`${rpcPort}/tcp`]: [{ HostPort: rpcPort.toString() }],
[`${tcpPort}/tcp`]: [{ HostPort: tcpPort.toString() }],
[`${websocketPort}/tcp`]: [{ HostPort: websocketPort.toString() }],
...(args?.peerExchange && {
[`${discv5UdpPort}/udp`]: [{ HostPort: discv5UdpPort.toString() }],
}),
},
},
ExposedPorts: {
[`${rpcPort}/tcp`]: {},
[`${tcpPort}/tcp`]: {},
[`${websocketPort}/tcp`]: {},
...(args?.peerExchange && {
[`${discv5UdpPort}/udp`]: {},
}),
},
Cmd: argsArrayWithIP,
});
await container.start();
await Dockerode.network.connect({
Container: container.id,
EndpointConfig: {
IPAMConfig: {
IPv4Address: this.containerIp,
},
},
});
const logStream = fs.createWriteStream(logPath);
container.logs(
{ follow: true, stdout: true, stderr: true },
(err, stream) => {
if (err) {
throw err;
}
if (stream) {
stream.pipe(logStream);
}
}
);
this.containerId = container.id;
log(`${this.containerId} started at ${new Date().toLocaleTimeString()}`);
return container;
}
async stop(): Promise<void> {
if (!this.container) throw "containerId not set";
log(
`Shutting down container ID ${
this.containerId
} at ${new Date().toLocaleTimeString()}`
);
await this.container.stop();
await this.container.remove();
this.containerId = undefined;
}
private async confirmImageExistsOrPull(): Promise<void> {
log(`Confirming that image ${this.IMAGE_NAME} exists`);
const doesImageExist = this.docker.getImage(this.IMAGE_NAME);
if (!doesImageExist) {
await new Promise<void>((resolve, reject) => {
this.docker.pull(this.IMAGE_NAME, {}, (err, stream) => {
if (err) {
reject(err);
}
this.docker.modem.followProgress(stream, (err, result) => {
if (err) {
reject(err);
}
if (result) {
resolve();
}
});
});
});
}
log(`Image ${this.IMAGE_NAME} successfully found`);
}
}
export function argsToArray(args: Args): Array<string> {
const array = [];
for (const [key, value] of Object.entries(args)) {
// Change the key from camelCase to kebab-case
const kebabKey = key.replace(/([A-Z])/g, (_, capital) => {
return "-" + capital.toLowerCase();
});
const arg = `--${kebabKey}=${value}`;
array.push(arg);
}
return array;
}

View File

@ -0,0 +1,53 @@
export interface Args {
staticnode?: string;
nat?: "none";
listenAddress?: string;
relay?: boolean;
rpc?: boolean;
rpcAdmin?: boolean;
nodekey?: string;
portsShift?: number;
logLevel?: LogLevel;
lightpush?: boolean;
filter?: boolean;
store?: boolean;
peerExchange?: boolean;
discv5Discovery?: boolean;
storeMessageDbUrl?: string;
topics?: string;
rpcPrivate?: boolean;
websocketSupport?: boolean;
tcpPort?: number;
rpcPort?: number;
websocketPort?: number;
discv5BootstrapNode?: string;
discv5UdpPort?: number;
}
export enum LogLevel {
Error = "ERROR",
Info = "INFO",
Warn = "WARN",
Debug = "DEBUG",
Trace = "TRACE",
Notice = "NOTICE",
Fatal = "FATAL",
}
export interface KeyPair {
privateKey: string;
publicKey: string;
}
export interface MessageRpcQuery {
payload: string; // Hex encoded data string without `0x` prefix.
contentTopic?: string;
timestamp?: bigint; // Unix epoch time in nanoseconds as a 64-bits integer value.
}
export interface MessageRpcResponse {
payload: string;
contentTopic?: string;
version?: number;
timestamp?: bigint; // Unix epoch time in nanoseconds as a 64-bits integer value.
}

View File

@ -1,5 +1,3 @@
import fs from "fs";
import type { PeerId } from "@libp2p/interface-peer-id";
import { peerIdFromString } from "@libp2p/peer-id";
import { Multiaddr, multiaddr } from "@multiformats/multiaddr";
@ -7,14 +5,22 @@ import { DefaultPubSubTopic } from "@waku/core";
import { isDefined } from "@waku/utils";
import { bytesToHex, hexToBytes } from "@waku/utils/bytes";
import debug from "debug";
import Docker from "dockerode";
import portfinder from "portfinder";
import { existsAsync, mkdirAsync, openAsync } from "./async_fs.js";
import { delay } from "./delay.js";
import waitForLine from "./log_file.js";
import { existsAsync, mkdirAsync, openAsync } from "../async_fs.js";
import { delay } from "../delay.js";
import waitForLine from "../log_file.js";
const log = debug("waku:nwaku");
import Dockerode from "./dockerode.js";
import {
Args,
KeyPair,
LogLevel,
MessageRpcQuery,
MessageRpcResponse,
} from "./interfaces.js";
const log = debug("waku:node");
const WAKU_SERVICE_NODE_PARAMS =
process.env.WAKU_SERVICE_NODE_PARAMS ?? undefined;
@ -35,63 +41,8 @@ BigInt.prototype.toJSON = function toJSON() {
return Number(this);
};
export interface Args {
staticnode?: string;
nat?: "none";
listenAddress?: string;
relay?: boolean;
rpc?: boolean;
rpcAdmin?: boolean;
nodekey?: string;
portsShift?: number;
logLevel?: LogLevel;
lightpush?: boolean;
filter?: boolean;
store?: boolean;
peerExchange?: boolean;
discv5Discovery?: boolean;
storeMessageDbUrl?: string;
topics?: string;
rpcPrivate?: boolean;
websocketSupport?: boolean;
tcpPort?: number;
rpcPort?: number;
websocketPort?: number;
discv5BootstrapNode?: string;
discv5UdpPort?: number;
}
export enum LogLevel {
Error = "ERROR",
Info = "INFO",
Warn = "WARN",
Debug = "DEBUG",
Trace = "TRACE",
Notice = "NOTICE",
Fatal = "FATAL",
}
export interface KeyPair {
privateKey: string;
publicKey: string;
}
export interface MessageRpcQuery {
payload: string; // Hex encoded data string without `0x` prefix.
contentTopic?: string;
timestamp?: bigint; // Unix epoch time in nanoseconds as a 64-bits integer value.
}
export interface MessageRpcResponse {
payload: string;
contentTopic?: string;
version?: number;
timestamp?: bigint; // Unix epoch time in nanoseconds as a 64-bits integer value.
}
export class Nwaku {
private docker: Docker;
private containerId?: string;
export class NimGoNode {
private docker?: Dockerode;
private peerId?: PeerId;
private multiaddrWithId?: Multiaddr;
private websocketPort?: number;
@ -124,11 +75,15 @@ export class Nwaku {
}
constructor(logName: string) {
this.docker = new Docker();
this.logPath = `${LOG_DIR}/nwaku_${logName}.log`;
this.logPath = `${LOG_DIR}/wakunode_${logName}.log`;
}
type(): "go-waku" | "nwaku" {
return isGoWaku ? "go-waku" : "nwaku";
}
async start(args: Args = {}): Promise<void> {
this.docker = await Dockerode.createInstance(DOCKER_IMAGE_NAME);
try {
await existsAsync(LOG_DIR);
} catch (e) {
@ -144,7 +99,7 @@ export class Nwaku {
const mergedArgs = defaultArgs();
// nwaku takes some time to bind port so to decrease chances of conflict
// waku nodes takes some time to bind port so to decrease chances of conflict
// we also randomize the first port that portfinder will try
const startPort = Math.floor(Math.random() * (65535 - 1025) + 1025);
@ -172,101 +127,37 @@ export class Nwaku {
websocketPort,
...(args?.peerExchange && { discv5UdpPort }),
},
{ rpcAddress: "0.0.0.0" },
args
);
process.env.WAKUNODE2_STORE_MESSAGE_DB_URL = "";
const argsArray = argsToArray(mergedArgs);
const natExtIp = "--nat=extip:127.0.0.1";
const rpcAddress = "--rpc-address=0.0.0.0";
argsArray.push(natExtIp, rpcAddress);
if (WAKU_SERVICE_NODE_PARAMS) {
argsArray.push(WAKU_SERVICE_NODE_PARAMS);
if (this.docker.container) {
await this.docker.stop();
}
log(`nwaku args: ${argsArray.join(" ")}`);
if (this.containerId) {
this.stop();
}
await this.docker.startContainer(
ports,
mergedArgs,
this.logPath,
WAKU_SERVICE_NODE_PARAMS
);
try {
await this.confirmImageExistsOrPull();
const container = await this.docker.createContainer({
Image: DOCKER_IMAGE_NAME,
HostConfig: {
PortBindings: {
[`${rpcPort}/tcp`]: [{ HostPort: rpcPort.toString() }],
[`${tcpPort}/tcp`]: [{ HostPort: tcpPort.toString() }],
[`${websocketPort}/tcp`]: [{ HostPort: websocketPort.toString() }],
...(args?.peerExchange && {
[`${discv5UdpPort}/udp`]: [
{ HostPort: discv5UdpPort.toString() },
],
}),
},
},
ExposedPorts: {
[`${rpcPort}/tcp`]: {},
[`${tcpPort}/tcp`]: {},
[`${websocketPort}/tcp`]: {},
...(args?.peerExchange && {
[`${discv5UdpPort}/udp`]: {},
}),
},
Cmd: argsArray,
});
await container.start();
const logStream = fs.createWriteStream(this.logPath);
container.logs(
{ follow: true, stdout: true, stderr: true },
(err, stream) => {
if (err) {
throw err;
}
if (stream) {
stream.pipe(logStream);
}
}
);
this.containerId = container.id;
log(
`nwaku ${
this.containerId
} started at ${new Date().toLocaleTimeString()}`
);
log(`Waiting to see '${NODE_READY_LOG_LINE}' in nwaku logs`);
log(`Waiting to see '${NODE_READY_LOG_LINE}' in ${this.type} logs`);
await this.waitForLog(NODE_READY_LOG_LINE, 15000);
if (process.env.CI) await delay(100);
log("nwaku node has been started");
log(`${this.type} node has been started`);
} catch (error) {
log(`Error starting nwaku: ${error}`);
if (this.containerId) await this.stop();
log(`Error starting ${this.type}: ${error}`);
if (this.docker.container) await this.docker.stop();
throw error;
}
}
public async stop(): Promise<void> {
if (!this.containerId) throw "nwaku containerId not set";
const container = this.docker.getContainer(this.containerId);
log(
`Shutting down nwaku container ID ${
this.containerId
} at ${new Date().toLocaleTimeString()}`
);
await container.remove({ force: true });
this.containerId = undefined;
this.docker?.stop();
}
async waitForLog(msg: string, timeout: number): Promise<void> {
@ -275,7 +166,7 @@ export class Nwaku {
/** Calls nwaku JSON-RPC API `get_waku_v2_admin_v1_peers` to check
* for known peers
* @throws if nwaku isn't started.
* @throws if WakuNode isn't started.
*/
async peers(): Promise<string[]> {
this.checkProcess();
@ -436,9 +327,9 @@ export class Nwaku {
const multiaddrWithId = res.listenAddresses
.map((ma) => multiaddr(ma))
.find((ma) => ma.protoNames().includes("ws"));
if (!multiaddrWithId) throw "Nwaku did not return a ws multiaddr";
if (!multiaddrWithId) throw `${this.type} did not return a ws multiaddr`;
const peerIdStr = multiaddrWithId.getPeerId();
if (!peerIdStr) throw "Nwaku multiaddr does not contain peerId";
if (!peerIdStr) throw `${this.type} multiaddr does not contain peerId`;
this.peerId = peerIdFromString(peerIdStr);
return this.peerId;
@ -469,50 +360,10 @@ export class Nwaku {
}
private checkProcess(): void {
if (!this.containerId || !this.docker.getContainer(this.containerId)) {
throw "Nwaku container hasn't started";
if (!this.docker?.container) {
throw `${this.type} container hasn't started`;
}
}
async confirmImageExistsOrPull(): Promise<void> {
log(`Confirming that image ${DOCKER_IMAGE_NAME} exists`);
const doesImageExist = this.docker.getImage(DOCKER_IMAGE_NAME);
if (!doesImageExist) {
await new Promise<void>((resolve, reject) => {
this.docker.pull(DOCKER_IMAGE_NAME, {}, (err, stream) => {
if (err) {
reject(err);
}
this.docker.modem.followProgress(stream, (err, result) => {
if (err) {
reject(err);
}
if (result) {
resolve();
}
});
});
});
}
log(`Image ${DOCKER_IMAGE_NAME} successfully found`);
}
}
export function argsToArray(args: Args): Array<string> {
const array = [];
for (const [key, value] of Object.entries(args)) {
// Change the key from camelCase to kebab-case
const kebabKey = key.replace(/([A-Z])/g, (_, capital) => {
return "-" + capital.toLowerCase();
});
const arg = `--${kebabKey}=${value}`;
array.push(arg);
}
return array;
}
export function defaultArgs(): Args {

View File

@ -5,11 +5,12 @@ import type { RelayNode } from "@waku/interfaces";
import { Protocols } from "@waku/interfaces";
import { expect } from "chai";
import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../src/index.js";
import { makeLogFileName, NOISE_KEY_1 } from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
describe("ENR Interop: nwaku", function () {
describe("ENR Interop: NimGoNode", function () {
let waku: RelayNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku &&
@ -19,7 +20,7 @@ describe("ENR Interop: nwaku", function () {
it("Relay", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
relay: true,
store: false,
@ -51,7 +52,7 @@ describe("ENR Interop: nwaku", function () {
it("Relay + Store", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
relay: true,
store: true,
@ -83,7 +84,7 @@ describe("ENR Interop: nwaku", function () {
it("All", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
relay: true,
store: true,

View File

@ -27,8 +27,8 @@ import {
makeLogFileName,
NOISE_KEY_1,
NOISE_KEY_2,
Nwaku,
} from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
const log = debug("waku:test:ephemeral");
@ -40,7 +40,7 @@ const TestDecoder = createDecoder(TestContentTopic);
describe("Waku Message Ephemeral field", () => {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku &&
@ -50,7 +50,7 @@ describe("Waku Message Ephemeral field", () => {
beforeEach(async function () {
this.timeout(15_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
filter: true,
lightpush: true,

View File

@ -12,7 +12,8 @@ import { bytesToUtf8, utf8ToBytes } from "@waku/utils/bytes";
import { expect } from "chai";
import debug from "debug";
import { delay, makeLogFileName, NOISE_KEY_1, Nwaku } from "../src/index.js";
import { delay, makeLogFileName, NOISE_KEY_1 } from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
const log = debug("waku:test");
@ -22,7 +23,7 @@ const TestDecoder = createDecoder(TestContentTopic);
describe("Waku Filter", () => {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku &&
@ -32,7 +33,7 @@ describe("Waku Filter", () => {
beforeEach(async function () {
this.timeout(15000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({ filter: true, lightpush: true, relay: true });
waku = await createLightNode({
staticNoiseKey: NOISE_KEY_1,

View File

@ -9,12 +9,12 @@ import debug from "debug";
import {
base64ToUtf8,
delay,
generateRandomUint8Array,
makeLogFileName,
MessageRpcResponse,
NimGoNode,
NOISE_KEY_1,
Nwaku,
} from "../src/index.js";
import { MessageRpcResponse } from "../src/node/interfaces.js";
import { generateRandomUint8Array } from "../src/random_array.js";
const log = debug("waku:test:lightpush");
@ -25,14 +25,14 @@ const TestEncoder = createEncoder({
describe("Waku Light Push [node only]", () => {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
const runNodes = async (
context: Mocha.Context,
pubSubTopic?: string
): Promise<void> => {
const nwakuOptional = pubSubTopic ? { topics: pubSubTopic } : {};
nwaku = new Nwaku(makeLogFileName(context));
nwaku = new NimGoNode(makeLogFileName(context));
await nwaku.start({
lightpush: true,
relay: true,

View File

@ -1,6 +1,7 @@
import { expect } from "chai";
import { argsToArray, defaultArgs } from "../src/index.js";
import { defaultArgs } from "../src/index.js";
import { argsToArray } from "../src/node/dockerode.js";
describe("nwaku", () => {
it("Correctly serialized arguments", function () {

View File

@ -14,8 +14,9 @@ import {
} from "@waku/peer-exchange";
import { expect } from "chai";
import { delay } from "../src/delay.js";
import { makeLogFileName } from "../src/log_file.js";
import { Nwaku } from "../src/nwaku.js";
import { NimGoNode } from "../src/node/nwaku.js";
describe("Peer Exchange", () => {
let waku: LightNode;
@ -62,12 +63,12 @@ describe("Peer Exchange", () => {
describe("Locally run nodes", () => {
let waku: LightNode;
let nwaku1: Nwaku;
let nwaku2: Nwaku;
let nwaku1: NimGoNode;
let nwaku2: NimGoNode;
beforeEach(async function () {
nwaku1 = new Nwaku(makeLogFileName(this) + "1");
nwaku2 = new Nwaku(makeLogFileName(this) + "2");
nwaku1 = new NimGoNode(makeLogFileName(this) + "1");
nwaku2 = new NimGoNode(makeLogFileName(this) + "2");
});
afterEach(async function () {
@ -77,9 +78,10 @@ describe("Peer Exchange", () => {
});
it("nwaku interop", async function () {
this.timeout(15_000);
this.timeout(55_000);
await nwaku1.start({
relay: true,
discv5Discovery: true,
peerExchange: true,
});
@ -87,6 +89,7 @@ describe("Peer Exchange", () => {
const enr = (await nwaku1.info()).enrUri;
await nwaku2.start({
relay: true,
discv5Discovery: true,
peerExchange: true,
discv5BootstrapNode: enr,
@ -107,8 +110,6 @@ describe("Peer Exchange", () => {
});
});
await nwaku2.waitForLog("Discovered px peers via discv5", 10);
// the forced type casting is done in ref to https://github.com/libp2p/js-libp2p-interfaces/issues/338#issuecomment-1431643645
const { connectionManager, registrar, peerStore } =
waku.libp2p as unknown as Libp2pComponents;
@ -122,9 +123,13 @@ describe("Peer Exchange", () => {
const numPeersToRequest = 1;
const peerInfos = (await peerExchange.query({
numPeers: numPeersToRequest,
})) as PeerInfo[];
let peerInfos: PeerInfo[] = [];
while (peerInfos.length <= 0) {
peerInfos = (await peerExchange.query({
numPeers: numPeersToRequest,
})) as PeerInfo[];
await delay(3000);
}
expect(peerInfos.length).to.be.greaterThan(0);
expect(peerInfos.length).to.be.lessThanOrEqual(numPeersToRequest);
@ -142,20 +147,21 @@ describe("Peer Exchange", () => {
});
describe("compliance test", async function () {
this.timeout(25_000);
this.timeout(55_000);
let waku: LightNode;
let nwaku1: Nwaku;
let nwaku2: Nwaku;
let nwaku1: NimGoNode;
let nwaku2: NimGoNode;
beforeEach(async function () {
nwaku1 = new Nwaku(makeLogFileName(this) + "1");
nwaku2 = new Nwaku(makeLogFileName(this) + "2");
nwaku1 = new NimGoNode(makeLogFileName(this) + "1");
nwaku2 = new NimGoNode(makeLogFileName(this) + "2");
});
tests({
async setup() {
await nwaku1.start({
relay: true,
discv5Discovery: true,
peerExchange: true,
});
@ -163,6 +169,7 @@ describe("Peer Exchange", () => {
const enr = (await nwaku1.info()).enrUri;
await nwaku2.start({
relay: true,
discv5Discovery: true,
peerExchange: true,
discv5BootstrapNode: enr,
@ -194,8 +201,8 @@ describe("Peer Exchange", () => {
return new PeerExchangeDiscovery(components);
},
teardown: async () => {
!!nwaku1 && nwaku1.stop();
!!nwaku2 && nwaku2.stop();
!!nwaku1 && (await nwaku1.stop());
!!nwaku2 && (await nwaku2.stop());
!!waku && (await waku.stop());
},
});

View File

@ -25,16 +25,15 @@ import { expect } from "chai";
import debug from "debug";
import {
base64ToUtf8,
delay,
generateRandomUint8Array,
makeLogFileName,
MessageRpcResponse,
NOISE_KEY_1,
NOISE_KEY_2,
NOISE_KEY_3,
Nwaku,
} from "../src/index.js";
import { MessageRpcResponse } from "../src/node/interfaces.js";
import { base64ToUtf8, NimGoNode } from "../src/node/nwaku.js";
import { generateRandomUint8Array } from "../src/random_array.js";
const log = debug("waku:test");
@ -400,9 +399,9 @@ describe("Waku Relay [node only]", () => {
});
});
describe("Interop: nwaku", function () {
describe("Interop: NimGoNode", function () {
let waku: RelayNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
beforeEach(async function () {
this.timeout(30_000);
@ -411,7 +410,7 @@ describe("Waku Relay [node only]", () => {
});
await waku.start();
nwaku = new Nwaku(this.test?.ctx?.currentTest?.title + "");
nwaku = new NimGoNode(this.test?.ctx?.currentTest?.title + "");
await nwaku.start({ relay: true });
await waku.dial(await nwaku.getMultiaddrWithId());
@ -471,7 +470,7 @@ describe("Waku Relay [node only]", () => {
);
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
contentTopic: TestContentTopic,
payload: utf8ToBytes(messageText),
})
@ -487,7 +486,7 @@ describe("Waku Relay [node only]", () => {
describe.skip("Two nodes connected to nwaku", function () {
let waku1: RelayNode;
let waku2: RelayNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku &&
@ -510,7 +509,7 @@ describe("Waku Relay [node only]", () => {
}).then((waku) => waku.start().then(() => waku)),
]);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start();
const nwakuMultiaddr = await nwaku.getMultiaddrWithId();

View File

@ -29,8 +29,8 @@ import {
makeLogFileName,
NOISE_KEY_1,
NOISE_KEY_2,
Nwaku,
} from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
const log = debug("waku:test:store");
@ -40,11 +40,11 @@ const TestDecoder = createDecoder(TestContentTopic);
describe("Waku Store", () => {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
beforeEach(async function () {
this.timeout(15_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({ store: true, lightpush: true, relay: true });
});
@ -61,7 +61,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -131,7 +131,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: utf8ToBytes(`Message ${i}`),
contentTopic: TestContentTopic,
})
@ -188,7 +188,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -229,7 +229,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -268,7 +268,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -307,7 +307,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -472,7 +472,7 @@ describe("Waku Store", () => {
for (let i = 0; i < 2; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
timestamp: messageTimestamps[i],
@ -534,7 +534,7 @@ describe("Waku Store", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
})
@ -568,11 +568,11 @@ describe("Waku Store", () => {
describe("Waku Store, custom pubsub topic", () => {
const customPubSubTopic = "/waku/2/custom-dapp/proto";
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
beforeEach(async function () {
this.timeout(15_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
store: true,
topics: customPubSubTopic,
@ -593,7 +593,7 @@ describe("Waku Store, custom pubsub topic", () => {
for (let i = 0; i < totalMsgs; i++) {
expect(
await nwaku.sendMessage(
Nwaku.toMessageRpcQuery({
NimGoNode.toMessageRpcQuery({
payload: new Uint8Array([i]),
contentTopic: TestContentTopic,
}),

View File

@ -11,7 +11,8 @@ import { toAsyncIterator } from "@waku/utils";
import { bytesToUtf8, utf8ToBytes } from "@waku/utils/bytes";
import { expect } from "chai";
import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../src/index.js";
import { makeLogFileName, NOISE_KEY_1 } from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
const TestContentTopic = "/test/1/waku-filter";
const TestEncoder = createEncoder({ contentTopic: TestContentTopic });
@ -19,11 +20,11 @@ const TestDecoder = createDecoder(TestContentTopic);
describe("Util: toAsyncIterator", () => {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
beforeEach(async function () {
this.timeout(15000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({ filter: true, lightpush: true, relay: true });
waku = await createLightNode({
staticNoiseKey: NOISE_KEY_1,

View File

@ -4,12 +4,13 @@ import type { LightNode, RelayNode } from "@waku/interfaces";
import { Protocols } from "@waku/interfaces";
import { expect } from "chai";
import { delay, makeLogFileName, NOISE_KEY_1, Nwaku } from "../src/index.js";
import { delay, makeLogFileName, NOISE_KEY_1 } from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
describe("Wait for remote peer", function () {
let waku1: RelayNode;
let waku2: LightNode;
let nwaku: Nwaku | undefined;
let nwaku: NimGoNode | undefined;
afterEach(async function () {
if (nwaku) {
@ -22,7 +23,7 @@ describe("Wait for remote peer", function () {
it("Relay - dialed first", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
relay: true,
store: false,
@ -47,7 +48,7 @@ describe("Wait for remote peer", function () {
it("Relay - dialed after", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
relay: true,
store: false,
@ -94,7 +95,7 @@ describe("Wait for remote peer", function () {
it("Store - dialed first", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
store: true,
relay: false,
@ -120,7 +121,7 @@ describe("Wait for remote peer", function () {
it("Store - dialed after - with timeout", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
store: true,
relay: false,
@ -148,7 +149,7 @@ describe("Wait for remote peer", function () {
it("LightPush", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
lightpush: true,
filter: false,
@ -176,7 +177,7 @@ describe("Wait for remote peer", function () {
it("Filter", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
filter: true,
lightpush: false,
@ -204,7 +205,7 @@ describe("Wait for remote peer", function () {
it("Light Node - default protocols", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
filter: true,
lightpush: true,
@ -244,7 +245,7 @@ describe("Wait for remote peer", function () {
it("Privacy Node - default protocol", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
filter: false,
lightpush: false,

View File

@ -16,19 +16,15 @@ import {
import { bytesToUtf8, utf8ToBytes } from "@waku/utils/bytes";
import { expect } from "chai";
import {
makeLogFileName,
NOISE_KEY_1,
NOISE_KEY_2,
Nwaku,
} from "../src/index.js";
import { makeLogFileName, NOISE_KEY_1, NOISE_KEY_2 } from "../src/index.js";
import { NimGoNode } from "../src/node/nwaku.js";
const TestContentTopic = "/test/1/waku/utf8";
describe("Waku Dial [node only]", function () {
describe("Interop: nwaku", function () {
describe("Interop: NimGoNode", function () {
let waku: Waku;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku &&
@ -38,7 +34,7 @@ describe("Waku Dial [node only]", function () {
it("connects to nwaku", async function () {
this.timeout(20_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start({
filter: true,
store: true,
@ -64,7 +60,7 @@ describe("Waku Dial [node only]", function () {
describe("Bootstrap", function () {
let waku: LightNode;
let nwaku: Nwaku;
let nwaku: NimGoNode;
afterEach(async function () {
!!nwaku && nwaku.stop();
@ -74,7 +70,7 @@ describe("Waku Dial [node only]", function () {
it("Passing an array", async function () {
this.timeout(10_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start();
const multiAddrWithId = await nwaku.getMultiaddrWithId();
waku = await createLightNode({
@ -97,7 +93,7 @@ describe("Waku Dial [node only]", function () {
it("Using a function", async function () {
this.timeout(10_000);
nwaku = new Nwaku(makeLogFileName(this));
nwaku = new NimGoNode(makeLogFileName(this));
await nwaku.start();
const nwakuMa = await nwaku.getMultiaddrWithId();