watcher-ts/packages/graph-node/src/loader.test.ts
Nabarun Gogoi cd29b47ecc
Implement peer package to send messages between peers (#279)
* Initial implementation of class and discoving other peers

* Implement peer connection and sending messages between peers

* Add react app and use peer package for broadcasting

* Maintain stream for each remote peer

* Refactor code in peer package

* Add serve package for react-app

* Add readme for running react app

* Add peer package readme

* Add logs for events with details

* Add a chat CLI using peer package (#280)

* Add a flag to instantiate Peer for nodejs

* Add a basic chat CLI using peer

* Add a signal server arg to chat CLI

* Add instructions for chat CLI

* Fix typescript and ESM issues after adding peer package (#282)

* Fix build issues in util package

* Update eslint TS plugins

* Scope react app package name

* Convert cli package back to CJS and dynamically import ESM

* Upgrade ts-node version

* Fix tests

* Setup a relay node and pubsub based discovery (#284)

* Add a script to setup a relay node

* Use pubsub based peer discovery

* Add peer multiaddr to connection log

* Catch relay node dial errors

* Increase discovery interval and dial all mutiaddr

* Add UI to display self peer ID and multiaddrs

* Add UI for displaying live remote connections

* Send js objects in peer broadcast messages

* Add react-peer package for using peer in react app

* Reduce disconnect frequency between peers (#287)

* Restrict number of max concurrent dials per peer

* Increase hop relay timeout to 1 day

* Self review changes

* Review changes

* Increase pubsub discovery interval and add steps to create a peer id  (#290)

* Increase pubsub discovery interval

* Disable autodial to avoid peer dials without protocol on a reconnect

* Add steps to create a peer id and use for relay node

* Add back dependency to run signalling server

* Avoid bootstrapping and dial to relay node directly

Co-authored-by: prathamesh0 <42446521+prathamesh0@users.noreply.github.com>
Co-authored-by: prathamesh0 <prathamesh.musale0@gmail.com>
2023-01-10 20:10:27 +05:30

126 lines
3.5 KiB
TypeScript

//
// Copyright 2021 Vulcanize, Inc.
//
import path from 'path';
import { expect } from 'chai';
import { utils } from 'ethers';
import { BaseProvider } from '@ethersproject/providers';
import { GraphDatabase } from '@cerc-io/util';
import { instantiate } from './loader';
import { getDummyGraphData, getTestDatabase, getTestIndexer, getTestProvider } from '../test/utils';
import { Indexer } from '../test/utils/indexer';
const WASM_FILE_PATH = '../build/debug.wasm';
describe('wasm loader tests', () => {
let exports: any;
let db: GraphDatabase;
let indexer: Indexer;
let provider: BaseProvider;
let module: WebAssembly.Module;
let dummyGraphData: any;
before(async () => {
db = getTestDatabase();
indexer = getTestIndexer();
provider = getTestProvider();
dummyGraphData = getDummyGraphData();
const filePath = path.resolve(__dirname, WASM_FILE_PATH);
const instance = await instantiate(
db,
indexer,
provider,
{},
filePath,
dummyGraphData
);
exports = instance.exports;
module = instance.module;
});
it('should execute exported function', async () => {
const { callGraphAPI } = exports;
callGraphAPI();
});
it('should execute async function', async () => {
const { callAsyncMethod } = exports;
await callAsyncMethod();
});
it('should use a class/instance created in wasm from JS', async () => {
const { Foo, __getString, __pin, __unpin } = exports;
const fooPtr = await __pin(await Foo.getFoo());
const foo = Foo.wrap(fooPtr);
const strPtr = await foo.getString();
expect(__getString(strPtr)).to.equal('hello world!');
await __unpin(fooPtr);
});
it('should instantiate a class in wasm from JS', async () => {
const { Foo, FooID, Bar, __getString, __new, __pin, __unpin, __newString } = exports;
const fooPtr = await __pin(await __new(FooID));
const foo = Foo.wrap(fooPtr);
const strPtr = await foo.getString();
expect(__getString(strPtr)).to.equal('hello world!');
__unpin(fooPtr);
const bar = await Bar.__new(await __newString('test'));
expect(__getString(await bar.prop)).to.equal('test');
});
it('should log messages', async () => {
const { testLog } = exports;
// Should print all log messages for different levels.
await testLog();
});
it('should throw out of memory error', async () => {
// Maximum memory is set to 10 pages (640KB) when compiling using asc maximumMemory option.
// https://www.assemblyscript.org/compiler.html#command-line-options
const { testMemory, __newString, memory } = exports;
try {
// Continue loop until memory size reaches max size 640KB
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer
while (memory.buffer.byteLength <= 1024 * 640) {
// Create long string of 100KB.
const longString = utils.hexValue(utils.randomBytes(1024 * 100 / 2));
const stringPtr = await __newString(longString);
await testMemory(stringPtr);
}
expect.fail('wasm code should throw error');
} catch (error: any) {
expect(error).to.be.instanceof(WebAssembly.RuntimeError);
expect(error.message).to.equal('unreachable');
}
});
it('should reinstantiate wasm', async () => {
const instance = await instantiate(
db,
indexer,
provider,
{},
module,
dummyGraphData
);
exports = instance.exports;
const { callGraphAPI } = exports;
await callGraphAPI();
});
});