aboutsummaryrefslogtreecommitdiffstats
path: root/test/utils
diff options
context:
space:
mode:
Diffstat (limited to 'test/utils')
-rw-r--r--test/utils/blockchain_clean.ts19
-rw-r--r--test/utils/constants.ts5
-rw-r--r--test/utils/rpc.ts48
-rw-r--r--test/utils/web3_factory.ts23
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;
+ },
+};