Truffle Test: как проверить SafeMath Library на переполнение

Как я могу проверить, устойчива ли функция к переполнению с помощью трюфельного теста?

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

Как я могу пройти этот тест?

Ответы (1)

Я на самом деле не знаю, как ваш код может скомпилироваться, это, очевидно, проблема

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)