|
|
@ -300,6 +300,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) |
|
|
|
VM vm(fev.gas); |
|
|
|
|
|
|
|
u256 gas; |
|
|
|
bool vmExceptionOccured = false; |
|
|
|
try |
|
|
|
{ |
|
|
|
output = vm.go(fev, fev.simpleTrace()).toVector(); |
|
|
@ -308,7 +309,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) |
|
|
|
catch (VMException const& _e) |
|
|
|
{ |
|
|
|
cnote << "VM did throw an exception: " << diagnostic_information(_e); |
|
|
|
gas = 0; |
|
|
|
vmExceptionOccured = true; |
|
|
|
} |
|
|
|
catch (Exception const& _e) |
|
|
|
{ |
|
|
@ -342,48 +343,58 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) |
|
|
|
{ |
|
|
|
o["env"] = mValue(fev.exportEnv()); |
|
|
|
o["exec"] = mValue(fev.exportExec()); |
|
|
|
o["post"] = mValue(fev.exportState()); |
|
|
|
o["callcreates"] = fev.exportCallCreates(); |
|
|
|
o["out"] = "0x" + toHex(output); |
|
|
|
fev.push(o, "gas", gas); |
|
|
|
if (!vmExceptionOccured) |
|
|
|
{ |
|
|
|
o["post"] = mValue(fev.exportState()); |
|
|
|
o["callcreates"] = fev.exportCallCreates(); |
|
|
|
o["out"] = "0x" + toHex(output); |
|
|
|
fev.push(o, "gas", gas); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
BOOST_REQUIRE(o.count("post") > 0); |
|
|
|
BOOST_REQUIRE(o.count("callcreates") > 0); |
|
|
|
BOOST_REQUIRE(o.count("out") > 0); |
|
|
|
BOOST_REQUIRE(o.count("gas") > 0); |
|
|
|
if (o.count("post") > 0) // No exceptions expected
|
|
|
|
{ |
|
|
|
BOOST_CHECK(!vmExceptionOccured); |
|
|
|
|
|
|
|
dev::test::FakeExtVM test; |
|
|
|
test.importState(o["post"].get_obj()); |
|
|
|
test.importCallCreates(o["callcreates"].get_array()); |
|
|
|
BOOST_REQUIRE(o.count("post") > 0); |
|
|
|
BOOST_REQUIRE(o.count("callcreates") > 0); |
|
|
|
BOOST_REQUIRE(o.count("out") > 0); |
|
|
|
BOOST_REQUIRE(o.count("gas") > 0); |
|
|
|
|
|
|
|
checkOutput(output, o); |
|
|
|
dev::test::FakeExtVM test; |
|
|
|
test.importState(o["post"].get_obj()); |
|
|
|
test.importCallCreates(o["callcreates"].get_array()); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(toInt(o["gas"]), gas); |
|
|
|
checkOutput(output, o); |
|
|
|
|
|
|
|
auto& expectedAddrs = test.addresses; |
|
|
|
auto& resultAddrs = fev.addresses; |
|
|
|
for (auto&& expectedPair : expectedAddrs) |
|
|
|
{ |
|
|
|
auto& expectedAddr = expectedPair.first; |
|
|
|
auto resultAddrIt = resultAddrs.find(expectedAddr); |
|
|
|
if (resultAddrIt == resultAddrs.end()) |
|
|
|
BOOST_ERROR("Missing expected address " << expectedAddr); |
|
|
|
else |
|
|
|
{ |
|
|
|
auto& expectedState = expectedPair.second; |
|
|
|
auto& resultState = resultAddrIt->second; |
|
|
|
BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState)); |
|
|
|
BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState)); |
|
|
|
BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code"); |
|
|
|
BOOST_CHECK_EQUAL(toInt(o["gas"]), gas); |
|
|
|
|
|
|
|
checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr); |
|
|
|
auto& expectedAddrs = test.addresses; |
|
|
|
auto& resultAddrs = fev.addresses; |
|
|
|
for (auto&& expectedPair : expectedAddrs) |
|
|
|
{ |
|
|
|
auto& expectedAddr = expectedPair.first; |
|
|
|
auto resultAddrIt = resultAddrs.find(expectedAddr); |
|
|
|
if (resultAddrIt == resultAddrs.end()) |
|
|
|
BOOST_ERROR("Missing expected address " << expectedAddr); |
|
|
|
else |
|
|
|
{ |
|
|
|
auto& expectedState = expectedPair.second; |
|
|
|
auto& resultState = resultAddrIt->second; |
|
|
|
BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState)); |
|
|
|
BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState)); |
|
|
|
BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code"); |
|
|
|
|
|
|
|
checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
checkAddresses<std::map<Address, std::tuple<u256, u256, std::map<u256, u256>, bytes> > >(test.addresses, fev.addresses); |
|
|
|
BOOST_CHECK(test.callcreates == fev.callcreates); |
|
|
|
checkAddresses<std::map<Address, std::tuple<u256, u256, std::map<u256, u256>, bytes> > >(test.addresses, fev.addresses); |
|
|
|
BOOST_CHECK(test.callcreates == fev.callcreates); |
|
|
|
} |
|
|
|
else // Exception expected
|
|
|
|
BOOST_CHECK(vmExceptionOccured); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|