Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 25 additions & 10 deletions scripts/tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -190,18 +190,33 @@ for optimize in "" "--optimize"
do
for vm in $EVM_VERSIONS
do
printTask "--> Running tests using "$optimize" --evm-version "$vm"..."
log=""
if [ -n "$log_directory" ]
FORCE_ABIV2_RUNS="no"
if [[ "$vm" == "constantinople" ]]
then
if [ -n "$optimize" ]
then
log=--logger=JUNIT,test_suite,$log_directory/opt_$vm.xml $testargs
else
log=--logger=JUNIT,test_suite,$log_directory/noopt_$vm.xml $testargs_no_opt
fi
FORCE_ABIV2_RUNS="no yes" # run both in constantinople
fi
"$REPO_ROOT"/build/test/soltest $progress $log -- --testpath "$REPO_ROOT"/test "$optimize" --evm-version "$vm" $SMT_FLAGS $IPC_FLAGS --ipcpath "${WORKDIR}/geth.ipc"
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=""
if [ -n "$log_directory" ]
then
if [ -n "$optimize" ]
then
log=--logger=JUNIT,test_suite,$log_directory/opt_$vm.xml $testargs
else
log=--logger=JUNIT,test_suite,$log_directory/noopt_$vm.xml $testargs_no_opt
fi
fi

"$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

Expand Down
2 changes: 2 additions & 0 deletions test/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ Options::Options()
}
else if (string(suite.argv[i]) == "--optimize")
optimize = true;
else if (string(suite.argv[i]) == "--abiencoderv2")
useABIEncoderV2 = true;
else if (string(suite.argv[i]) == "--evm-version")
{
evmVersionString = i + 1 < suite.argc ? suite.argv[i + 1] : "INVALID";
Expand Down
1 change: 1 addition & 0 deletions test/Options.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct Options: boost::noncopyable
bool optimize = false;
bool disableIPC = false;
bool disableSMT = false;
bool useABIEncoderV2 = false;

void validate() const;
solidity::EVMVersion evmVersion() const;
Expand Down
2 changes: 1 addition & 1 deletion test/libsolidity/ABIDecoderTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(enums)
}
}
)";
bool newDecoder = false;
bool newDecoder = dev::test::Options::get().useABIEncoderV2;
BOTH_ENCODERS(
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("f(uint8)", 0), encodeArgs(u256(0)));
Expand Down
11 changes: 7 additions & 4 deletions test/libsolidity/ABIEncoderTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,13 @@ BOOST_AUTO_TEST_CASE(memory_array_one_dim)
}
)";

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

compileAndRun(NewEncoderPragma + sourceCode);
callContractFunction("f()");
Expand Down
6 changes: 6 additions & 0 deletions test/libsolidity/GasCosts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,19 @@ BOOST_AUTO_TEST_CASE(string_storage)

if (Options::get().evmVersion() <= EVMVersion::byzantium())
CHECK_GAS(134435, 130591, 100);
// This is only correct on >=Constantinople.
else if (Options::get().useABIEncoderV2)
CHECK_GAS(151819, 142753, 100);
else
CHECK_GAS(127225, 124873, 100);
if (Options::get().evmVersion() >= EVMVersion::byzantium())
{
callContractFunction("f()");
if (Options::get().evmVersion() == EVMVersion::byzantium())
CHECK_GAS(21551, 21526, 20);
// This is only correct on >=Constantinople.
else if (Options::get().useABIEncoderV2)
CHECK_GAS(21713, 21635, 20);
else
CHECK_GAS(21546, 21526, 20);
}
Expand Down
22 changes: 16 additions & 6 deletions test/libsolidity/GasMeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,14 @@ class GasMeterTestFramework: public SolidityExecutionFramework
// costs for transaction
gas += gasForTransaction(m_compiler.object(m_compiler.lastContractName()).bytecode, true);

BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
// 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_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
}
}

/// Compares the gas computed by PathGasMeter for the given signature (but unknown arguments)
Expand All @@ -97,9 +102,14 @@ class GasMeterTestFramework: public SolidityExecutionFramework
*m_compiler.runtimeAssemblyItems(m_compiler.lastContractName()),
_sig
);
BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
// 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_CHECK_LE(m_gasUsed, gas.value);
BOOST_CHECK_LE(gas.value - _tolerance, m_gasUsed);
}
}

static GasMeter::GasConsumption gasForTransaction(bytes const& _data, bool _isCreation)
Expand Down
15 changes: 10 additions & 5 deletions test/libsolidity/SolidityEndToEndTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14317,12 +14317,17 @@ BOOST_AUTO_TEST_CASE(abi_encode_empty_string)
}
}
)";

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

BOOST_AUTO_TEST_CASE(abi_encode_empty_string_v2)
Expand Down
5 changes: 4 additions & 1 deletion test/libsolidity/SolidityExecutionFramework.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,10 @@ class SolidityExecutionFramework: public dev::test::ExecutionFramework
)
{
// 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.addSource("", sourceCode);
m_compiler.setLibraries(_libraryAddresses);
Expand Down