Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save JCGit2018/9f79d5ef6b966f193987ae707c271856 to your computer and use it in GitHub Desktop.

Select an option

Save JCGit2018/9f79d5ef6b966f193987ae707c271856 to your computer and use it in GitHub Desktop.
When TestRPC and Geth throw, they behave in a different manner. This Gist is an example on how to cover such a situation.
module.exports = function expectedExceptionPromise(action, gasToUse) {
return new Promise(function (resolve, reject) {
try {
resolve(action());
} catch(e) {
reject(e);
}
})
.then(function (txObj) {
return typeof txn === "string"
? web3.eth.getTransactionReceiptMined(txObj) // regular tx hash
: typeof txObj.receipt !== "undefined"
? txObj.receipt // truffle-contract function call
: typeof txObj.transactionHash === "string"
? web3.eth.getTransactionReceiptMined(txObj.transactionHash) // deployment
: txObj; // Unknown last case
})
.then(function (receipt) {
// We are in Geth
if (typeof receipt.status !== "undefined") {
// Byzantium
assert.strictEqual(receipt.status, "0x0", "should have reverted");
} else {
// Pre Byzantium
assert.equal(receipt.gasUsed, gasToUse, "should have used all the gas");
}
})
.catch(function (e) {
if ((e + "").indexOf("invalid JUMP") > -1 ||
(e + "").indexOf("out of gas") > -1 ||
(e + "").indexOf("invalid opcode") > -1 ||
(e + "").indexOf("revert") > -1) {
// We are in TestRPC
} else if ((e + "").indexOf("please check your gas amount") > -1) {
// We are in Geth for a deployment
} else {
throw e;
}
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment