2021-03-22 16:02:10 +11:00
|
|
|
import { expect } from 'chai';
|
2022-01-20 13:00:58 +11:00
|
|
|
import debug from 'debug';
|
2021-08-10 11:32:14 +10:00
|
|
|
import PeerId from 'peer-id';
|
2021-03-22 16:02:10 +11:00
|
|
|
|
2021-08-10 11:32:14 +10:00
|
|
|
import {
|
|
|
|
makeLogFileName,
|
|
|
|
NimWaku,
|
|
|
|
NOISE_KEY_1,
|
|
|
|
NOISE_KEY_2,
|
|
|
|
} from '../test_utils/';
|
2021-03-10 17:39:53 +11:00
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
import { delay } from './delay';
|
2021-05-10 15:26:14 +10:00
|
|
|
import { Waku } from './waku';
|
2021-09-01 15:02:28 +10:00
|
|
|
import { WakuMessage } from './waku_message';
|
|
|
|
import { generateSymmetricKey } from './waku_message/version_1';
|
2022-01-20 13:00:58 +11:00
|
|
|
import { RelayCodecs } from './waku_relay';
|
|
|
|
|
|
|
|
const dbg = debug('waku:test');
|
2021-09-01 15:02:28 +10:00
|
|
|
|
|
|
|
const TestContentTopic = '/test/1/waku/utf8';
|
2021-03-10 16:25:54 +11:00
|
|
|
|
2021-09-24 17:15:46 +10:00
|
|
|
describe('Waku Dial [node only]', function () {
|
2022-01-20 13:00:58 +11:00
|
|
|
describe('Interop: Nim', function () {
|
|
|
|
let waku: Waku;
|
|
|
|
let nimWaku: NimWaku;
|
2021-08-09 12:27:52 +10:00
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
afterEach(async function () {
|
|
|
|
nimWaku ? nimWaku.stop() : null;
|
|
|
|
waku ? await waku.stop() : null;
|
|
|
|
});
|
2021-08-09 12:27:52 +10:00
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
// TODO: Clarify whether nwaku's `get_waku_v2_admin_v1_peers` can be expected
|
|
|
|
// to return peers with inbound connections.
|
|
|
|
it.skip('js connects to nim', async function () {
|
|
|
|
this.timeout(20_000);
|
|
|
|
nimWaku = new NimWaku(makeLogFileName(this));
|
|
|
|
await nimWaku.start();
|
|
|
|
const multiAddrWithId = await nimWaku.getMultiaddrWithId();
|
2021-08-10 11:32:14 +10:00
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
waku = await Waku.create({
|
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
|
|
|
});
|
|
|
|
await waku.dial(multiAddrWithId);
|
|
|
|
await waku.waitForConnectedPeer([RelayCodecs]);
|
|
|
|
|
|
|
|
let nimPeers = await nimWaku.peers();
|
|
|
|
while (nimPeers.length === 0) {
|
|
|
|
await delay(200);
|
|
|
|
nimPeers = await nimWaku.peers();
|
|
|
|
dbg('nimPeers', nimPeers);
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(nimPeers).to.deep.equal([
|
|
|
|
{
|
|
|
|
multiaddr: multiAddrWithId,
|
|
|
|
protocol: '/vac/waku/relay/2.0.0',
|
|
|
|
connected: true,
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
|
|
|
|
const nimPeerId = await nimWaku.getPeerId();
|
|
|
|
const jsPeers = waku.libp2p.peerStore.peers;
|
|
|
|
|
|
|
|
expect(jsPeers.has(nimPeerId.toB58String())).to.be.true;
|
|
|
|
});
|
2021-08-10 11:32:14 +10:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('Bootstrap', function () {
|
2022-01-20 13:00:58 +11:00
|
|
|
let waku: Waku;
|
|
|
|
let nimWaku: NimWaku;
|
|
|
|
|
|
|
|
afterEach(async function () {
|
|
|
|
nimWaku ? nimWaku.stop() : null;
|
|
|
|
waku ? await waku.stop() : null;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Enabling default [live data]', async function () {
|
2021-09-21 14:22:35 +10:00
|
|
|
// This test depends on fleets.status.im being online.
|
|
|
|
// This dependence must be removed once DNS discovery is implemented
|
|
|
|
this.timeout(20_000);
|
|
|
|
|
|
|
|
waku = await Waku.create({
|
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
2022-01-13 14:28:45 +11:00
|
|
|
bootstrap: { default: true },
|
2021-09-21 14:22:35 +10:00
|
|
|
});
|
|
|
|
|
|
|
|
const connectedPeerID: PeerId = await new Promise((resolve) => {
|
|
|
|
waku.libp2p.connectionManager.on('peer:connect', (connection) => {
|
|
|
|
resolve(connection.remotePeer);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(connectedPeerID).to.not.be.undefined;
|
|
|
|
});
|
|
|
|
|
2021-08-10 11:32:14 +10:00
|
|
|
it('Passing an array', async function () {
|
|
|
|
this.timeout(10_000);
|
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
nimWaku = new NimWaku(makeLogFileName(this));
|
|
|
|
await nimWaku.start();
|
|
|
|
const multiAddrWithId = await nimWaku.getMultiaddrWithId();
|
|
|
|
|
2021-08-10 11:32:14 +10:00
|
|
|
waku = await Waku.create({
|
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
2022-01-20 13:00:58 +11:00
|
|
|
bootstrap: { peers: [multiAddrWithId.toString()] },
|
2021-08-10 11:32:14 +10:00
|
|
|
});
|
|
|
|
|
|
|
|
const connectedPeerID: PeerId = await new Promise((resolve) => {
|
|
|
|
waku.libp2p.connectionManager.on('peer:connect', (connection) => {
|
|
|
|
resolve(connection.remotePeer);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
expect(connectedPeerID.toB58String()).to.eq(multiAddrWithId.getPeerId());
|
2021-08-10 11:32:14 +10:00
|
|
|
});
|
|
|
|
|
|
|
|
it('Passing a function', async function () {
|
|
|
|
this.timeout(10_000);
|
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
nimWaku = new NimWaku(makeLogFileName(this));
|
|
|
|
await nimWaku.start();
|
|
|
|
const multiAddrWithId = await nimWaku.getMultiaddrWithId();
|
|
|
|
|
2021-08-10 11:32:14 +10:00
|
|
|
waku = await Waku.create({
|
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
2022-01-13 14:28:45 +11:00
|
|
|
bootstrap: {
|
|
|
|
getPeers: async () => {
|
|
|
|
return [multiAddrWithId];
|
|
|
|
},
|
2021-08-10 11:32:14 +10:00
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const connectedPeerID: PeerId = await new Promise((resolve) => {
|
|
|
|
waku.libp2p.connectionManager.on('peer:connect', (connection) => {
|
|
|
|
resolve(connection.remotePeer);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2022-01-20 13:00:58 +11:00
|
|
|
expect(connectedPeerID.toB58String()).to.eq(multiAddrWithId.getPeerId());
|
2021-03-19 15:03:31 +11:00
|
|
|
});
|
|
|
|
});
|
2021-03-10 17:39:53 +11:00
|
|
|
});
|
2021-09-01 15:02:28 +10:00
|
|
|
|
|
|
|
describe('Decryption Keys', () => {
|
|
|
|
afterEach(function () {
|
|
|
|
if (this.currentTest?.state === 'failed') {
|
|
|
|
console.log(`Test failed, log file name is ${makeLogFileName(this)}`);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
let waku1: Waku;
|
|
|
|
let waku2: Waku;
|
|
|
|
beforeEach(async function () {
|
|
|
|
[waku1, waku2] = await Promise.all([
|
|
|
|
Waku.create({ staticNoiseKey: NOISE_KEY_1 }),
|
|
|
|
Waku.create({
|
|
|
|
staticNoiseKey: NOISE_KEY_2,
|
|
|
|
libp2p: { addresses: { listen: ['/ip4/0.0.0.0/tcp/0/ws'] } },
|
|
|
|
}),
|
|
|
|
]);
|
|
|
|
|
|
|
|
waku1.addPeerToAddressBook(waku2.libp2p.peerId, waku2.libp2p.multiaddrs);
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
new Promise((resolve) =>
|
|
|
|
waku1.libp2p.pubsub.once('pubsub:subscription-change', () =>
|
|
|
|
resolve(null)
|
|
|
|
)
|
|
|
|
),
|
|
|
|
new Promise((resolve) =>
|
|
|
|
waku2.libp2p.pubsub.once('pubsub:subscription-change', () =>
|
|
|
|
resolve(null)
|
|
|
|
)
|
|
|
|
),
|
|
|
|
]);
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(async function () {
|
|
|
|
this.timeout(5000);
|
|
|
|
await waku1.stop();
|
|
|
|
await waku2.stop();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Used by Waku Relay', async function () {
|
|
|
|
this.timeout(10000);
|
|
|
|
|
|
|
|
const symKey = generateSymmetricKey();
|
|
|
|
|
|
|
|
waku2.addDecryptionKey(symKey);
|
|
|
|
|
|
|
|
const messageText = 'Message is encrypted';
|
|
|
|
const messageTimestamp = new Date('1995-12-17T03:24:00');
|
|
|
|
const message = await WakuMessage.fromUtf8String(
|
|
|
|
messageText,
|
|
|
|
TestContentTopic,
|
|
|
|
{
|
|
|
|
timestamp: messageTimestamp,
|
|
|
|
symKey,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
const receivedMsgPromise: Promise<WakuMessage> = new Promise((resolve) => {
|
|
|
|
waku2.relay.addObserver(resolve);
|
|
|
|
});
|
|
|
|
|
|
|
|
await waku1.relay.send(message);
|
|
|
|
|
|
|
|
const receivedMsg = await receivedMsgPromise;
|
|
|
|
|
|
|
|
expect(receivedMsg.contentTopic).to.eq(message.contentTopic);
|
|
|
|
expect(receivedMsg.version).to.eq(message.version);
|
|
|
|
expect(receivedMsg.payloadAsUtf8).to.eq(messageText);
|
|
|
|
expect(receivedMsg.timestamp?.valueOf()).to.eq(messageTimestamp.valueOf());
|
|
|
|
});
|
|
|
|
});
|