diff --git a/lib/tests/reporter.js b/lib/tests/reporter.js index 75d8ff01..de20b469 100644 --- a/lib/tests/reporter.js +++ b/lib/tests/reporter.js @@ -7,6 +7,7 @@ class EmbarkSpec extends Base { super(runner, options); const self = this; + self.listenForGas = true; self.embarkEvents = options.reporterOptions.events; self.gasDetails = options.reporterOptions.gasDetails; self.gasLimit = options.reporterOptions.gasLimit; @@ -27,6 +28,9 @@ class EmbarkSpec extends Base { } function onBlockHeader(blockHeader) { + if(!self.listenForGas) { + return; + } self.stats.totalGasCost += blockHeader.gasUsed; self.stats.test.gasUsed += blockHeader.gasUsed; } @@ -35,6 +39,9 @@ class EmbarkSpec extends Base { self.embarkEvents.on("deploy:contract:receipt", onContractReceipt); } self.embarkEvents.on("block:header", onBlockHeader); + self.embarkEvents.setCommandHandler("reporter:toggleGasListener", () => { + self.listenForGas = !self.listenForGas; + }); function indent() { return Array(indents).join(' '); diff --git a/lib/tests/run_tests.js b/lib/tests/run_tests.js index 87451ee7..f0dc6501 100644 --- a/lib/tests/run_tests.js +++ b/lib/tests/run_tests.js @@ -61,7 +61,7 @@ module.exports = { }, function setupGlobalNamespace(files, next) { // TODO put default config - const test = new Test({loglevel, node: options.node}); + const test = new Test({loglevel, node: options.node, coverage: options.coverage}); global.embark = test; global.assert = assert; global.config = test.config.bind(test); @@ -105,6 +105,7 @@ module.exports = { gasDetails: options.gasDetails, gasLimit: 6000000 }); + mocha.addFile(file); mocha.suite.timeout(0); diff --git a/lib/tests/test.js b/lib/tests/test.js index 0c7c636d..4a280af6 100644 --- a/lib/tests/test.js +++ b/lib/tests/test.js @@ -102,37 +102,40 @@ class Test { let simProvider = this.sim.provider(this.simOptions); - // Here we patch the sendAsync method on the provider. The goal behind this is to force pure/constant/view calls to become - // transactions, so that we can pull in execution traces and account for those executions in code coverage. - // - // Instead of a simple call, here's what happens: - // - // 1) A transaction is sent with the same payload, and a pre-defined gas price; - // 2) We wait for the transaction to be mined by asking for the receipt; - // 3) Once we get the receipt back, we dispatch the real call and pass the original callback; - // - // This will still allow tests to get the return value from the call and run contracts unmodified. - simProvider.realSendAsync = simProvider.sendAsync.bind(simProvider); - simProvider.sendAsync = function(payload, cb) { - if(payload.method !== 'eth_call') { - return simProvider.realSendAsync(payload, cb); - } + if (this.options.coverage) { + // Here we patch the sendAsync method on the provider. The goal behind this is to force pure/constant/view calls to become + // transactions, so that we can pull in execution traces and account for those executions in code coverage. + // + // Instead of a simple call, here's what happens: + // + // 1) A transaction is sent with the same payload, and a pre-defined gas price; + // 2) We wait for the transaction to be mined by asking for the receipt; + // 3) Once we get the receipt back, we dispatch the real call and pass the original callback; + // + // This will still allow tests to get the return value from the call and run contracts unmodified. + simProvider.realSendAsync = simProvider.sendAsync.bind(simProvider); + simProvider.sendAsync = function(payload, cb) { + if(payload.method !== 'eth_call') { + return simProvider.realSendAsync(payload, cb); + } + self.engine.events.request('reporter:toggleGasListener'); + let newParams = Object.assign({}, payload.params[0], {gasPrice: '0x77359400'}); + let newPayload = { + id: payload.id + 1, + method: 'eth_sendTransaction', + params: [newParams], + jsonrpc: payload.jsonrpc + }; - let newParams = Object.assign({}, payload.params[0], {gasPrice: '0x77359400'}); - let newPayload = { - id: payload.id + 1, - method: 'eth_sendTransaction', - params: [newParams], - jsonrpc: payload.jsonrpc - }; - - simProvider.realSendAsync(newPayload, (_err, response) => { - let txHash = response.result; - self.web3.eth.getTransactionReceipt(txHash, (_err, _res) => { - simProvider.realSendAsync(payload, cb); + simProvider.realSendAsync(newPayload, (_err, response) => { + let txHash = response.result; + self.web3.eth.getTransactionReceipt(txHash, (_err, _res) => { + self.engine.events.request('reporter:toggleGasListener'); + simProvider.realSendAsync(payload, cb); + }); }); - }); - }; + }; + } this.web3.setProvider(simProvider); callback();