diff options
Diffstat (limited to 'test/utils')
-rw-r--r-- | test/utils/blockchain_clean.ts | 19 | ||||
-rw-r--r-- | test/utils/constants.ts | 5 | ||||
-rw-r--r-- | test/utils/rpc.ts | 48 | ||||
-rw-r--r-- | test/utils/web3_factory.ts | 23 |
4 files changed, 95 insertions, 0 deletions
diff --git a/test/utils/blockchain_clean.ts b/test/utils/blockchain_clean.ts new file mode 100644 index 000000000..6468dbec7 --- /dev/null +++ b/test/utils/blockchain_clean.ts @@ -0,0 +1,19 @@ +import {RPC} from './rpc'; + +export class BlockchainClean { + private rpc: RPC; + private snapshotId: number; + constructor() { + this.rpc = new RPC(); + } + // TODO: Check if running on TestRPC or on actual node, if actual node, re-deploy contracts instead + public async setupAsync() { + this.snapshotId = await this.rpc.takeSnapshotAsync(); + } + public async restoreAsync() { + const didRevert = await this.rpc.revertSnapshotAsync(this.snapshotId); + if (!didRevert) { + throw new Error(`Snapshot with id #${this.snapshotId} failed to revert`); + } + } +}; diff --git a/test/utils/constants.ts b/test/utils/constants.ts new file mode 100644 index 000000000..aa1967f88 --- /dev/null +++ b/test/utils/constants.ts @@ -0,0 +1,5 @@ +export const constants = { + NULL_ADDRESS: '0x0000000000000000000000000000000000000000', + RPC_HOST: 'localhost', + RPC_PORT: 8545, +}; diff --git a/test/utils/rpc.ts b/test/utils/rpc.ts new file mode 100644 index 000000000..b689a938c --- /dev/null +++ b/test/utils/rpc.ts @@ -0,0 +1,48 @@ +import * as ethUtil from 'ethereumjs-util'; +import * as request from 'request-promise-native'; +import {constants} from './constants'; + +export class RPC { + private host: string; + private port: number; + private id: number; + constructor() { + this.host = constants.RPC_HOST; + this.port = constants.RPC_PORT; + this.id = 0; + } + public async takeSnapshotAsync(): Promise<number> { + const method = 'evm_snapshot'; + const params: any[] = []; + const payload = this.toPayload(method, params); + const snapshotIdHex = await this.sendAsync(payload); + const snapshotId = ethUtil.bufferToInt(ethUtil.toBuffer(snapshotIdHex)); + return snapshotId; + } + public async revertSnapshotAsync(snapshotId: number): Promise<boolean> { + const method = 'evm_revert'; + const params = [snapshotId]; + const payload = this.toPayload(method, params); + const didRevert = await this.sendAsync(payload); + return didRevert; + } + private toPayload(method: string, params: any[] = []) { + const payload = JSON.stringify({ + id: this.id, + method, + params, + }); + this.id += 1; + return payload; + } + private async sendAsync(payload: string) { + const opts = { + method: 'POST', + uri: `http://${this.host}:${this.port}`, + body: payload, + }; + const bodyString = await request(opts); + const body = JSON.parse(bodyString); + return body.result; + } +} diff --git a/test/utils/web3_factory.ts b/test/utils/web3_factory.ts new file mode 100644 index 000000000..493fbc2df --- /dev/null +++ b/test/utils/web3_factory.ts @@ -0,0 +1,23 @@ +// HACK: web3 injects XMLHttpRequest into the global scope and ProviderEngine checks XMLHttpRequest +// to know whether it is running in a browser or node environment. We need it to be undefined since +// we are not running in a browser env. +// Filed issue: https://github.com/ethereum/web3.js/issues/844 +(global as any).XMLHttpRequest = undefined; +import ProviderEngine = require('web3-provider-engine'); +import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); +import * as Web3 from 'web3'; +import {constants} from './constants'; + +export const web3Factory = { + create(): Web3 { + const provider = new ProviderEngine(); + const rpcUrl = `http://${constants.RPC_HOST}:${constants.RPC_PORT}`; + provider.addProvider(new RpcSubprovider({ + rpcUrl, + })); + provider.start(); + const web3 = new Web3(); + web3.setProvider(provider); + return web3; + }, +}; |