Add more tests for state access (block, msg, tx, etc.)

Move some of them out of SolidityEndToEndTests. Additionally this ensures the deterministic values of the testing infrastructure.
This commit is contained in:
Alex Beregszaszi 2020-12-09 19:47:50 +00:00
parent 9e07981920
commit f9d6abf69b
17 changed files with 199 additions and 76 deletions

View File

@ -814,28 +814,6 @@ BOOST_AUTO_TEST_CASE(constructor)
)
}
BOOST_AUTO_TEST_CASE(blockchain)
{
char const* sourceCode = R"(
contract test {
constructor() payable {}
function someInfo() public payable returns (uint256 value, address coinbase, uint256 blockNumber) {
value = msg.value;
coinbase = block.coinbase;
blockNumber = block.number;
}
}
)";
m_evmcHost->tx_context.block_coinbase = EVMHost::convertToEVMC(h160("0x1212121212121212121212121212121212121212"));
m_evmcHost->newBlock();
m_evmcHost->newBlock();
m_evmcHost->newBlock();
m_evmcHost->newBlock();
m_evmcHost->newBlock();
compileAndRun(sourceCode, 27);
ABI_CHECK(callContractFunctionWithValue("someInfo()", 28), encodeArgs(28, u256("0x1212121212121212121212121212121212121212"), 7));
}
BOOST_AUTO_TEST_CASE(send_ether)
{
char const* sourceCode = R"(
@ -898,25 +876,6 @@ BOOST_AUTO_TEST_CASE(transfer_ether)
)
}
BOOST_AUTO_TEST_CASE(uncalled_blockhash)
{
char const* code = R"(
contract C {
function f() public view returns (bytes32)
{
return (blockhash)(block.number - 1);
}
}
)";
ALSO_VIA_YUL(
DISABLE_EWASM_TESTRUN()
compileAndRun(code, 0, "C");
bytes result = callContractFunction("f()");
BOOST_REQUIRE_EQUAL(result.size(), 32);
BOOST_CHECK(result[0] != 0 || result[1] != 0 || result[2] != 0);
)
}
BOOST_AUTO_TEST_CASE(log0)
{
char const* sourceCode = R"(
@ -1507,41 +1466,6 @@ BOOST_AUTO_TEST_CASE(contracts_as_addresses)
BOOST_REQUIRE(callContractFunction("getBalance()") == encodeArgs(u256(20 - 5), u256(5)));
}
BOOST_AUTO_TEST_CASE(gaslimit)
{
char const* sourceCode = R"(
contract C {
function f() public returns (uint) {
return block.gaslimit;
}
}
)";
ALSO_VIA_YUL(
DISABLE_EWASM_TESTRUN()
compileAndRun(sourceCode);
auto result = callContractFunction("f()");
ABI_CHECK(result, encodeArgs(gasLimit()));
)
}
BOOST_AUTO_TEST_CASE(gasprice)
{
char const* sourceCode = R"(
contract C {
function f() public returns (uint) {
return tx.gasprice;
}
}
)";
ALSO_VIA_YUL(
DISABLE_EWASM_TESTRUN()
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("f()"), encodeArgs(gasPrice()));
)
}
BOOST_AUTO_TEST_CASE(blockhash)
{
char const* sourceCode = R"(

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (address payable) {
return block.coinbase;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x7878787878787878787878787878787878787878
// f() -> 0x7878787878787878787878787878787878787878
// f() -> 0x7878787878787878787878787878787878787878

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (uint) {
return block.difficulty;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 200000000
// f() -> 200000000
// f() -> 200000000

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (uint) {
return block.gaslimit;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 20000000
// f() -> 20000000
// f() -> 20000000

View File

@ -0,0 +1,12 @@
contract C {
constructor() {}
function f() public returns (uint) {
return block.number;
}
}
// ====
// compileViaYul: also
// ----
// constructor()
// f() -> 2
// f() -> 3

View File

@ -0,0 +1,12 @@
contract C {
constructor() {}
function f() public returns (uint) {
return block.timestamp;
}
}
// ====
// compileViaYul: also
// ----
// constructor() # This is the 1st block #
// f() -> 0x1e # This is the 2nd block (each block is "15 seconds") #
// f() -> 0x2d # This is the 3rd block #

View File

@ -0,0 +1,23 @@
contract C {
bytes32 public genesisHash;
bytes32 public currentHash;
constructor() {
require(block.number == 1);
genesisHash = blockhash(0);
currentHash = blockhash(1);
}
function f(uint blockNumber) public returns (bytes32) {
return blockhash(blockNumber);
}
}
// ====
// compileViaYul: also
// ----
// constructor()
// genesisHash() -> 0x3737373737373737373737373737373737373737373737373737373737373737
// currentHash() -> 0
// f(uint256): 0 -> 0x3737373737373737373737373737373737373737373737373737373737373737
// f(uint256): 1 -> 0x3737373737373737373737373737373737373737373737373737373737373738
// f(uint256): 255 -> 0x00
// f(uint256): 256 -> 0x00
// f(uint256): 257 -> 0x00

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (bool) {
return gasleft() > 0;
}
}
// ====
// compileViaYul: also
// ----
// f() -> true
// f() -> true
// f() -> true

View File

@ -0,0 +1,13 @@
contract C {
function f() public returns (bytes calldata) {
return msg.data;
}
function g(uint,bool) public returns (bytes calldata) {
return msg.data;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x20, 4, 17219911917854084299749778639755835327755045716242581057573779540915269926912
// g(uint256,bool): 1234, true -> 0x20, 0x44, 35691323728519381642872894128098848782337736632589179916067422734266033766400, 33268574187263889506619096617382224251268236217415066441681855047532544, 26959946667150639794667015087019630673637144422540572481103610249216

View File

@ -0,0 +1,9 @@
contract C {
function f() public returns (address payable) {
return msg.sender;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x1212121212121212121212121212120000000012

View File

@ -0,0 +1,13 @@
contract C {
function f() public returns (bytes4) {
return msg.sig;
}
function g() public returns (bytes4) {
return msg.sig;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
// g() -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000

View File

@ -0,0 +1,10 @@
contract C {
function f() public payable returns (uint) {
return msg.value;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0
// f(), 12 ether -> 12000000000000000000

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (uint) {
return tx.gasprice;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 3000000000
// f() -> 3000000000
// f() -> 3000000000

View File

@ -0,0 +1,11 @@
contract C {
function f() public returns (address payable) {
return tx.origin;
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x9292929292929292929292929292929292929292
// f() -> 0x9292929292929292929292929292929292929292
// f() -> 0x9292929292929292929292929292929292929292

View File

@ -0,0 +1,9 @@
contract C {
function f() public returns (bytes32) {
return (blockhash)(block.number - 1);
}
}
// ====
// compileViaYul: also
// ----
// f() -> 0x3737373737373737373737373737373737373737373737373737373737373738

View File

@ -0,0 +1,16 @@
contract C {
function f() public view returns (address payable) {
return block.coinbase;
}
function g() public view returns (uint) {
return block.difficulty;
}
function h() public view returns (uint) {
return block.gaslimit;
}
function i() public view returns (uint) {
return block.timestamp;
}
}
// ====
// EVMVersion: <istanbul

View File

@ -0,0 +1,16 @@
contract C {
function f() public view returns (address payable) {
return block.coinbase;
}
function g() public view returns (uint) {
return block.difficulty;
}
function h() public view returns (uint) {
return block.gaslimit;
}
function i() public view returns (uint) {
return block.timestamp;
}
}
// ====
// EVMVersion: >=istanbul