Merge pull request #5102 from ethereum/abiencoderv2-tests

Run all end-to-end tests with ABIEncoderV2
This commit is contained in:
chriseth 2019-02-21 13:11:06 +01:00 committed by GitHub
commit 27d936cf44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 72 additions and 27 deletions

View File

@ -190,7 +190,20 @@ for optimize in "" "--optimize"
do do
for vm in $EVM_VERSIONS for vm in $EVM_VERSIONS
do do
printTask "--> Running tests using "$optimize" --evm-version "$vm"..." FORCE_ABIV2_RUNS="no"
if [[ "$vm" == "constantinople" ]]
then
FORCE_ABIV2_RUNS="no yes" # run both in constantinople
fi
for abiv2 in $FORCE_ABIV2_RUNS
do
force_abiv2_flag=""
if [[ "$abiv2" == "yes" ]]
then
force_abiv2_flag="--abiencoderv2"
fi
printTask "--> Running tests using "$optimize" --evm-version "$vm" $force_abiv2_flag..."
log="" log=""
if [ -n "$log_directory" ] if [ -n "$log_directory" ]
then then
@ -201,7 +214,9 @@ do
log=--logger=JUNIT,test_suite,$log_directory/noopt_$vm.xml $testargs_no_opt log=--logger=JUNIT,test_suite,$log_directory/noopt_$vm.xml $testargs_no_opt
fi fi
fi fi
"$REPO_ROOT"/build/test/soltest $progress $log -- --testpath "$REPO_ROOT"/test "$optimize" --evm-version "$vm" $SMT_FLAGS $IPC_FLAGS --ipcpath "${WORKDIR}/geth.ipc"
"$REPO_ROOT"/build/test/soltest $progress $log -- --testpath "$REPO_ROOT"/test "$optimize" --evm-version "$vm" $SMT_FLAGS $IPC_FLAGS $force_abiv2_flag --ipcpath "${WORKDIR}/geth.ipc"
done
done done
done done

View File

@ -55,6 +55,8 @@ Options::Options()
} }
else if (string(suite.argv[i]) == "--optimize") else if (string(suite.argv[i]) == "--optimize")
optimize = true; optimize = true;
else if (string(suite.argv[i]) == "--abiencoderv2")
useABIEncoderV2 = true;
else if (string(suite.argv[i]) == "--evm-version") else if (string(suite.argv[i]) == "--evm-version")
{ {
evmVersionString = i + 1 < suite.argc ? suite.argv[i + 1] : "INVALID"; evmVersionString = i + 1 < suite.argc ? suite.argv[i + 1] : "INVALID";

View File

@ -41,6 +41,7 @@ struct Options: boost::noncopyable
bool optimize = false; bool optimize = false;
bool disableIPC = false; bool disableIPC = false;
bool disableSMT = false; bool disableSMT = false;
bool useABIEncoderV2 = false;
void validate() const; void validate() const;
solidity::EVMVersion evmVersion() const; solidity::EVMVersion evmVersion() const;

View File

@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(enums)
} }
} }
)"; )";
bool newDecoder = false; bool newDecoder = dev::test::Options::get().useABIEncoderV2;
BOTH_ENCODERS( BOTH_ENCODERS(
compileAndRun(sourceCode); compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("f(uint8)", 0), encodeArgs(u256(0))); ABI_CHECK(callContractFunction("f(uint8)", 0), encodeArgs(u256(0)));

View File

@ -164,10 +164,13 @@ BOOST_AUTO_TEST_CASE(memory_array_one_dim)
} }
)"; )";
if (!dev::test::Options::get().useABIEncoderV2)
{
compileAndRun(sourceCode); compileAndRun(sourceCode);
callContractFunction("f()"); callContractFunction("f()");
// The old encoder does not clean array elements. // The old encoder does not clean array elements.
REQUIRE_LOG_DATA(encodeArgs(10, 0x60, 11, 3, u256("0xfffffffe"), u256("0xffffffff"), u256("0x100000000"))); REQUIRE_LOG_DATA(encodeArgs(10, 0x60, 11, 3, u256("0xfffffffe"), u256("0xffffffff"), u256("0x100000000")));
}
compileAndRun(NewEncoderPragma + sourceCode); compileAndRun(NewEncoderPragma + sourceCode);
callContractFunction("f()"); callContractFunction("f()");

View File

@ -70,6 +70,9 @@ BOOST_AUTO_TEST_CASE(string_storage)
if (Options::get().evmVersion() <= EVMVersion::byzantium()) if (Options::get().evmVersion() <= EVMVersion::byzantium())
CHECK_GAS(134435, 130591, 100); CHECK_GAS(134435, 130591, 100);
// This is only correct on >=Constantinople.
else if (Options::get().useABIEncoderV2)
CHECK_GAS(151819, 142753, 100);
else else
CHECK_GAS(127225, 124873, 100); CHECK_GAS(127225, 124873, 100);
if (Options::get().evmVersion() >= EVMVersion::byzantium()) if (Options::get().evmVersion() >= EVMVersion::byzantium())
@ -77,6 +80,9 @@ BOOST_AUTO_TEST_CASE(string_storage)
callContractFunction("f()"); callContractFunction("f()");
if (Options::get().evmVersion() == EVMVersion::byzantium()) if (Options::get().evmVersion() == EVMVersion::byzantium())
CHECK_GAS(21551, 21526, 20); CHECK_GAS(21551, 21526, 20);
// This is only correct on >=Constantinople.
else if (Options::get().useABIEncoderV2)
CHECK_GAS(21713, 21635, 20);
else else
CHECK_GAS(21546, 21526, 20); CHECK_GAS(21546, 21526, 20);
} }

View File

@ -73,10 +73,15 @@ public:
// costs for transaction // costs for transaction
gas += gasForTransaction(m_compiler.object(m_compiler.lastContractName()).bytecode, true); gas += gasForTransaction(m_compiler.object(m_compiler.lastContractName()).bytecode, true);
// Skip the tests when we force ABIEncoderV2.
// TODO: We should enable this again once the yul optimizer is activated.
if (!dev::test::Options::get().useABIEncoderV2)
{
BOOST_REQUIRE(!gas.isInfinite); BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value); BOOST_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed); BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
} }
}
/// Compares the gas computed by PathGasMeter for the given signature (but unknown arguments) /// Compares the gas computed by PathGasMeter for the given signature (but unknown arguments)
/// against the actual gas usage computed by the VM on the given set of argument variants. /// against the actual gas usage computed by the VM on the given set of argument variants.
@ -97,10 +102,15 @@ public:
*m_compiler.runtimeAssemblyItems(m_compiler.lastContractName()), *m_compiler.runtimeAssemblyItems(m_compiler.lastContractName()),
_sig _sig
); );
// Skip the tests when we force ABIEncoderV2.
// TODO: We should enable this again once the yul optimizer is activated.
if (!dev::test::Options::get().useABIEncoderV2)
{
BOOST_REQUIRE(!gas.isInfinite); BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value); BOOST_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed); BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
} }
}
static GasMeter::GasConsumption gasForTransaction(bytes const& _data, bool _isCreation) static GasMeter::GasConsumption gasForTransaction(bytes const& _data, bool _isCreation)
{ {

View File

@ -14317,12 +14317,17 @@ BOOST_AUTO_TEST_CASE(abi_encode_empty_string)
} }
} }
)"; )";
compileAndRun(sourceCode, 0, "C"); compileAndRun(sourceCode, 0, "C");
if (!dev::test::Options::get().useABIEncoderV2)
{
// ABI Encoder V2 has slightly different padding, tested below.
ABI_CHECK(callContractFunction("f()"), encodeArgs( ABI_CHECK(callContractFunction("f()"), encodeArgs(
0x40, 0xc0, 0x40, 0xc0,
0x60, 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00,
0x00 0x00
)); ));
}
} }
BOOST_AUTO_TEST_CASE(abi_encode_empty_string_v2) BOOST_AUTO_TEST_CASE(abi_encode_empty_string_v2)

View File

@ -65,7 +65,10 @@ public:
) )
{ {
// Silence compiler version warning // Silence compiler version warning
std::string sourceCode = "pragma solidity >=0.0;\n" + _sourceCode; std::string sourceCode = "pragma solidity >=0.0;\n";
if (dev::test::Options::get().useABIEncoderV2 && _sourceCode.find("pragma experimental ABIEncoderV2;") == std::string::npos)
sourceCode += "pragma experimental ABIEncoderV2;\n";
sourceCode += _sourceCode;
m_compiler.reset(false); m_compiler.reset(false);
m_compiler.addSource("", sourceCode); m_compiler.addSource("", sourceCode);
m_compiler.setLibraries(_libraryAddresses); m_compiler.setLibraries(_libraryAddresses);