Как я могу проверить, устойчива ли функция к переполнению с помощью трюфельного теста?
contract SafeMath{
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract TestSafeMath{
function test_add_10_and_max_should_return_err() {
uint256 max = 2**256 - 1;
uint256 expected = "revert overflow error";
Assert.errorsEqual(SafeMathExt.add(10, max), expected, "Addition of 10 and max should revert");
}
}
TestSafeMath 1) test_add_max_and_10_should_return_err No events were emitted 1 failing
Как я могу пройти этот тест?
Я на самом деле не знаю, как ваш код может скомпилироваться, это, очевидно, проблема
uint256 expected = "revert overflow error";
а также метод errorsEqual библиотеки assert ожидает два кода ошибки
В любом случае, один из способов обойти это - попытаться сделать необработанный вызов, чтобы проверить, есть ли статус возврата внутри виртуальной машины. Метод call вернет true, если вызов был выполнен правильно, и false в противном случае.
pragma solidity ^0.4.19;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/SafeMath.sol";
contract TestSafeMath {
SafeMath instance;
constructor() public {
instance = SafeMath(DeployedAddresses.SafeMath());
}
function testAdd_10_and_max_should_return_err() public {
uint256 max = 2**256 - 1;
bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, max);
Assert.isFalse(passed, "test should fail");
}
function testAdd_10_and_10_should_be_ok() public {
uint256 value = 10;
bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, value);
Assert.isTrue(passed, "test should not fail");
Assert.equal(instance.add(10, value), value + 10, "should be 20");
}
}
Чтобы получить фактическое значение, вам нужно снова вызвать метод, поскольку необработанный вызов не даст вам возвращаемого значения (см. Второй метод тестирования).
вывод
TestSafeMath
✓ testAdd_10_and_max_should_return_err (53ms)
✓ testAdd_10_and_10_should_be_ok (66ms)
2 passing (987ms)