From 555bac19cb90a83d5a0025e53341f76ff39c4373 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 26 May 2017 17:12:22 +0200 Subject: Setup blockchain snapshotting before/after every test, implemented unit tests for exchangeWrapper.isValidSignature --- test/utils/blockchain_clean.ts | 19 +++++++++++++++++ test/utils/constants.ts | 5 +++++ test/utils/rpc.ts | 48 ++++++++++++++++++++++++++++++++++++++++++ test/utils/web3_factory.ts | 23 ++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 test/utils/blockchain_clean.ts create mode 100644 test/utils/constants.ts create mode 100644 test/utils/rpc.ts create mode 100644 test/utils/web3_factory.ts (limited to 'test/utils') 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 { + 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 { + 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; + }, +}; -- cgit v1.2.3 From a6da9cd07389b317624ad00a3cb73b75820687e1 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 26 May 2017 17:47:00 +0200 Subject: Add missing return types --- test/utils/blockchain_clean.ts | 4 ++-- test/utils/rpc.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'test/utils') diff --git a/test/utils/blockchain_clean.ts b/test/utils/blockchain_clean.ts index 6468dbec7..18b7e3a5b 100644 --- a/test/utils/blockchain_clean.ts +++ b/test/utils/blockchain_clean.ts @@ -7,10 +7,10 @@ export class BlockchainClean { this.rpc = new RPC(); } // TODO: Check if running on TestRPC or on actual node, if actual node, re-deploy contracts instead - public async setupAsync() { + public async setupAsync(): Promise { this.snapshotId = await this.rpc.takeSnapshotAsync(); } - public async restoreAsync() { + public async restoreAsync(): Promise { 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/rpc.ts b/test/utils/rpc.ts index b689a938c..e331fa6d4 100644 --- a/test/utils/rpc.ts +++ b/test/utils/rpc.ts @@ -26,7 +26,7 @@ export class RPC { const didRevert = await this.sendAsync(payload); return didRevert; } - private toPayload(method: string, params: any[] = []) { + private toPayload(method: string, params: any[] = []): string { const payload = JSON.stringify({ id: this.id, method, @@ -35,7 +35,7 @@ export class RPC { this.id += 1; return payload; } - private async sendAsync(payload: string) { + private async sendAsync(payload: string): Promise { const opts = { method: 'POST', uri: `http://${this.host}:${this.port}`, -- cgit v1.2.3 From d5feb5fc792c54bcf4a3a029ddc404e95a5df166 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 26 May 2017 18:01:54 +0200 Subject: rename BlockClean to BlockchainLifecycle and setupAsync to startAsync, restoreAsync to revertAsync --- test/utils/blockchain_clean.ts | 19 ------------------- test/utils/blockchain_lifecycle.ts | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 test/utils/blockchain_clean.ts create mode 100644 test/utils/blockchain_lifecycle.ts (limited to 'test/utils') diff --git a/test/utils/blockchain_clean.ts b/test/utils/blockchain_clean.ts deleted file mode 100644 index 18b7e3a5b..000000000 --- a/test/utils/blockchain_clean.ts +++ /dev/null @@ -1,19 +0,0 @@ -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(): Promise { - this.snapshotId = await this.rpc.takeSnapshotAsync(); - } - public async restoreAsync(): Promise { - 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/blockchain_lifecycle.ts b/test/utils/blockchain_lifecycle.ts new file mode 100644 index 000000000..f7342b680 --- /dev/null +++ b/test/utils/blockchain_lifecycle.ts @@ -0,0 +1,19 @@ +import {RPC} from './rpc'; + +export class BlockchainLifecycle { + 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 startAsync(): Promise { + this.snapshotId = await this.rpc.takeSnapshotAsync(); + } + public async revertAsync(): Promise { + const didRevert = await this.rpc.revertSnapshotAsync(this.snapshotId); + if (!didRevert) { + throw new Error(`Snapshot with id #${this.snapshotId} failed to revert`); + } + } +}; -- cgit v1.2.3 From 4c3c1d049b0d6dd147a56b3ce9e6ccc17686acf1 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 26 May 2017 18:08:50 +0200 Subject: improve comment --- test/utils/blockchain_lifecycle.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'test/utils') diff --git a/test/utils/blockchain_lifecycle.ts b/test/utils/blockchain_lifecycle.ts index f7342b680..68e169ac0 100644 --- a/test/utils/blockchain_lifecycle.ts +++ b/test/utils/blockchain_lifecycle.ts @@ -6,7 +6,8 @@ export class BlockchainLifecycle { constructor() { this.rpc = new RPC(); } - // TODO: Check if running on TestRPC or on actual node, if actual node, re-deploy contracts instead + // TODO: In order to run these tests on an actual node, we should check if we are running against + // TestRPC, if so, use snapshots, otherwise re-deploy contracts before every test public async startAsync(): Promise { this.snapshotId = await this.rpc.takeSnapshotAsync(); } -- cgit v1.2.3