From 91e4d1b435087ceca4cf64e946d7f6f6e63d4ce6 Mon Sep 17 00:00:00 2001 From: "fryorcraken.eth" Date: Thu, 8 Sep 2022 11:25:18 +1000 Subject: [PATCH] test: uses full nodes in tests Ref: https://github.com/status-im/nwaku/issues/1085 --- CHANGELOG.md | 1 + src/lib/create_waku.ts | 40 +++++++++++++++++++++- src/lib/interfaces.ts | 7 ++++ src/lib/waku_filter/index.node.spec.ts | 8 ++--- src/lib/waku_light_push/index.node.spec.ts | 10 +++--- src/lib/waku_store/index.node.spec.ts | 26 +++++++------- 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51600c43a1..f2b4835de2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Simple connection management that selects the most recent connection for store, light push and filter requests. - `createLightNode` to create a Waku node for resource restricted environment with Light Push, Filter and Relay. - `createPrivacyNode` to create a Waku node for privacy preserving usage with Relay only. +- `createFullNode` to create a Waku node for with all protocols, for **testing purposes only**. ### Changed diff --git a/src/lib/create_waku.ts b/src/lib/create_waku.ts index c6b776292f..cbe6d943f7 100644 --- a/src/lib/create_waku.ts +++ b/src/lib/create_waku.ts @@ -6,7 +6,7 @@ import { all as filterAll } from "@libp2p/websockets/filters"; import { createLibp2p, Libp2pOptions } from "libp2p"; import type { Libp2p } from "libp2p"; -import type { Waku, WakuLight, WakuPrivacy } from "./interfaces"; +import type { Waku, WakuFull, WakuLight, WakuPrivacy } from "./interfaces"; import { PeerDiscoveryStaticPeers } from "./peer_discovery_static_list"; import { getPredefinedBootstrapNodes } from "./predefined_bootstrap_nodes"; import { WakuNode, WakuOptions } from "./waku"; @@ -100,6 +100,44 @@ export async function createPrivacyNode( return new WakuNode(options ?? {}, libp2p) as WakuPrivacy; } +/** + * Create a Waku node that uses all Waku protocols. + * + * This helper is not recommended except if: + * - you are interfacing with nwaku v0.11 or below + * - you are doing some form of testing + * + * If you are building a full node, it is recommended to use + * [nwaku](github.com/status-im/nwaku) and its JSON RPC API or wip REST API. + * + * @see https://github.com/status-im/nwaku/issues/1085 + * @internal + */ +export async function createFullNode( + options?: CreateOptions & WakuOptions +): Promise { + const libp2pOptions = options?.libp2p ?? {}; + const peerDiscovery = libp2pOptions.peerDiscovery ?? []; + if (options?.defaultBootstrap) { + peerDiscovery.push(defaultPeerDiscovery()); + Object.assign(libp2pOptions, { peerDiscovery }); + } + + const libp2p = await defaultLibp2p(new WakuRelay(options), libp2pOptions); + + const wakuStore = new WakuStore(libp2p, options); + const wakuLightPush = new WakuLightPush(libp2p, options); + const wakuFilter = new WakuFilter(libp2p, options); + + return new WakuNode( + options ?? {}, + libp2p, + wakuStore, + wakuLightPush, + wakuFilter + ) as WakuFull; +} + /** * @deprecated use { @link createLightNode } (only compatible with nwaku v0.12), * { @link createPrivacyNode } or { @link Waku.constructor } instead; diff --git a/src/lib/interfaces.ts b/src/lib/interfaces.ts index 8b2c93606d..1f315dc0fe 100644 --- a/src/lib/interfaces.ts +++ b/src/lib/interfaces.ts @@ -51,3 +51,10 @@ export interface WakuPrivacy extends Waku { filter: undefined; lightPush: undefined; } + +export interface WakuFull extends Waku { + relay: WakuRelay; + store: WakuStore; + filter: WakuFilter; + lightPush: WakuLightPush; +} diff --git a/src/lib/waku_filter/index.node.spec.ts b/src/lib/waku_filter/index.node.spec.ts index 6c3ca82cda..da0dfdefdf 100644 --- a/src/lib/waku_filter/index.node.spec.ts +++ b/src/lib/waku_filter/index.node.spec.ts @@ -3,8 +3,8 @@ import debug from "debug"; import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../../test_utils"; import { delay } from "../../test_utils/delay"; -import { createLightNode } from "../create_waku"; -import type { WakuLight } from "../interfaces"; +import { createFullNode } from "../create_waku"; +import type { WakuFull } from "../interfaces"; import { waitForRemotePeer } from "../wait_for_remote_peer"; import { Protocols } from "../waku"; import { WakuMessage } from "../waku_message"; @@ -14,7 +14,7 @@ const log = debug("waku:test"); const TestContentTopic = "/test/1/waku-filter"; describe("Waku Filter", () => { - let waku: WakuLight; + let waku: WakuFull; let nwaku: Nwaku; afterEach(async function () { @@ -26,7 +26,7 @@ describe("Waku Filter", () => { this.timeout(15000); nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start({ filter: true, lightpush: true }); - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, libp2p: { addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] } }, }); diff --git a/src/lib/waku_light_push/index.node.spec.ts b/src/lib/waku_light_push/index.node.spec.ts index 5be99d1d0d..5a435e5b4c 100644 --- a/src/lib/waku_light_push/index.node.spec.ts +++ b/src/lib/waku_light_push/index.node.spec.ts @@ -3,8 +3,8 @@ import debug from "debug"; import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../../test_utils"; import { delay } from "../../test_utils/delay"; -import { createLightNode } from "../create_waku"; -import type { WakuLight } from "../interfaces"; +import { createFullNode } from "../create_waku"; +import type { WakuFull } from "../interfaces"; import { waitForRemotePeer } from "../wait_for_remote_peer"; import { Protocols } from "../waku"; import { WakuMessage } from "../waku_message"; @@ -14,7 +14,7 @@ const log = debug("waku:test:lightpush"); const TestContentTopic = "/test/1/waku-light-push/utf8"; describe("Waku Light Push [node only]", () => { - let waku: WakuLight; + let waku: WakuFull; let nwaku: Nwaku; afterEach(async function () { @@ -28,7 +28,7 @@ describe("Waku Light Push [node only]", () => { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start({ lightpush: true }); - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start(); @@ -64,7 +64,7 @@ describe("Waku Light Push [node only]", () => { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start({ lightpush: true, topics: customPubSubTopic }); - waku = await createLightNode({ + waku = await createFullNode({ pubSubTopic: customPubSubTopic, staticNoiseKey: NOISE_KEY_1, }); diff --git a/src/lib/waku_store/index.node.spec.ts b/src/lib/waku_store/index.node.spec.ts index 323dd221ef..6ba5841977 100644 --- a/src/lib/waku_store/index.node.spec.ts +++ b/src/lib/waku_store/index.node.spec.ts @@ -7,13 +7,13 @@ import { NOISE_KEY_2, Nwaku, } from "../../test_utils"; -import { createLightNode } from "../create_waku"; +import { createFullNode } from "../create_waku"; import { generatePrivateKey, generateSymmetricKey, getPublicKey, } from "../crypto"; -import type { WakuLight } from "../interfaces"; +import type { WakuFull } from "../interfaces"; import { waitForRemotePeer } from "../wait_for_remote_peer"; import { Protocols } from "../waku"; import { DecryptionMethod, WakuMessage } from "../waku_message"; @@ -25,7 +25,7 @@ const log = debug("waku:test:store"); const TestContentTopic = "/test/1/waku-store/utf8"; describe("Waku Store", () => { - let waku: WakuLight; + let waku: WakuFull; let nwaku: Nwaku; afterEach(async function () { @@ -49,7 +49,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start(); @@ -82,7 +82,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start(); @@ -122,7 +122,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start(); @@ -159,7 +159,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start(); @@ -202,7 +202,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ pubSubTopic: customPubSubTopic, staticNoiseKey: NOISE_KEY_1, }); @@ -269,10 +269,10 @@ describe("Waku Store", () => { log("Messages have been encrypted"); const [waku1, waku2, nimWakuMultiaddr] = await Promise.all([ - createLightNode({ + createFullNode({ staticNoiseKey: NOISE_KEY_1, }).then((waku) => waku.start().then(() => waku)), - createLightNode({ + createFullNode({ staticNoiseKey: NOISE_KEY_2, }).then((waku) => waku.start().then(() => waku)), nwaku.getMultiaddrWithId(), @@ -371,10 +371,10 @@ describe("Waku Store", () => { log("Messages have been encrypted"); const [waku1, waku2, nimWakuMultiaddr] = await Promise.all([ - createLightNode({ + createFullNode({ staticNoiseKey: NOISE_KEY_1, }).then((waku) => waku.start().then(() => waku)), - createLightNode({ + createFullNode({ staticNoiseKey: NOISE_KEY_2, }).then((waku) => waku.start().then(() => waku)), nwaku.getMultiaddrWithId(), @@ -458,7 +458,7 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await createLightNode({ + waku = await createFullNode({ staticNoiseKey: NOISE_KEY_1, }); await waku.start();