diff options
author | Christoph Jentzsch <jentzsch.software@gmail.com> | 2014-11-03 23:33:02 +0800 |
---|---|---|
committer | Christoph Jentzsch <jentzsch.software@gmail.com> | 2014-11-03 23:33:02 +0800 |
commit | 6eeef2762c0e784bf0c44793376a70430575d34d (patch) | |
tree | d8bc55513734f16a88cdc35dc2469c405e509a36 /state.cpp | |
parent | bc1aaa78a8fc2954e45e5cea9118f61aec16ad80 (diff) | |
download | dexon-solidity-6eeef2762c0e784bf0c44793376a70430575d34d.tar.gz dexon-solidity-6eeef2762c0e784bf0c44793376a70430575d34d.tar.zst dexon-solidity-6eeef2762c0e784bf0c44793376a70430575d34d.zip |
Clean up and organize tests + state class tests
Diffstat (limited to 'state.cpp')
-rw-r--r-- | state.cpp | 173 |
1 files changed, 40 insertions, 133 deletions
@@ -37,20 +37,15 @@ using namespace std; using namespace json_spirit; using namespace dev; using namespace dev::eth; -using namespace dev::eth::test; - -class FakeState: public State -{ - -}; - +using namespace dev::eth; -namespace dev { namespace eth{ namespace test { +namespace dev { namespace test { void doStateTests(json_spirit::mValue& v, bool _fillin) { + cout << "start state test\n"; for (auto& i: v.get_obj()) { cnote << i.first; @@ -58,7 +53,7 @@ void doStateTests(json_spirit::mValue& v, bool _fillin) BOOST_REQUIRE(o.count("env") > 0); BOOST_REQUIRE(o.count("pre") > 0); - BOOST_REQUIRE(o.count("exec") > 0); + BOOST_REQUIRE(o.count("transaction") > 0); ImportTest importer(o,_fillin); @@ -68,57 +63,47 @@ void doStateTests(json_spirit::mValue& v, bool _fillin) importer.m_environment.code = &importer.code; } - ExtVM evm(importer.m_statePre, importer.m_environment.myAddress, - importer.m_environment.caller, importer.m_environment.origin, - importer.m_environment.value, importer.m_environment.gasPrice, - importer.m_environment.data, importer.m_environment.code, - importer.getManifest()); + State theState = importer.m_statePre; + + bytes tx = importer.m_transaction.rlp(); bytes output; - VM vm(importer.gasExec); + + // check + + for (auto const& a: theState.addresses()) + { + cout << "address: " << a.first << endl; + cout << "balance: " << theState.balance(a.first) << endl; + cout << "has code: " << theState.addressHasCode(a.first) << endl; + } + try { - output = vm.go(evm, Executive::simpleTrace()).toVector(); + theState.execute(tx, &output); } catch (Exception const& _e) { - cnote << "VM did throw an exception: " << diagnostic_information(_e); - //BOOST_ERROR("Failed VM Test with Exception: " << e.what()); + cnote << "state execution did throw an exception: " << diagnostic_information(_e); } catch (std::exception const& _e) { - cnote << "VM did throw an exception: " << _e.what(); - //BOOST_ERROR("Failed VM Test with Exception: " << e.what()); + cnote << "state execution did throw an exception: " << _e.what(); } if (_fillin) - importer.exportTest(output, vm.gas(), evm.state()); + importer.exportTest(output, theState); 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); - // check output + checkOutput(output, o); - int j = 0; - if (o["out"].type() == array_type) - for (auto const& d: o["out"].get_array()) - { - BOOST_CHECK_MESSAGE(output[j] == toInt(d), "Output byte [" << j << "] different!"); - ++j; - } - else if (o["out"].get_str().find("0x") == 0) - BOOST_CHECK(output == fromHex(o["out"].get_str().substr(2))); - else - BOOST_CHECK(output == fromHex(o["out"].get_str())); - - BOOST_CHECK_EQUAL(toInt(o["gas"]), vm.gas()); - + // check addresses auto expectedAddrs = importer.m_statePost.addresses(); - auto resultAddrs = evm.state().addresses(); + auto resultAddrs = theState.addresses(); for (auto& expectedPair : expectedAddrs) { auto& expectedAddr = expectedPair.first; @@ -127,115 +112,37 @@ void doStateTests(json_spirit::mValue& v, bool _fillin) BOOST_ERROR("Missing expected address " << expectedAddr); else { - BOOST_CHECK_MESSAGE(importer.m_statePost.balance(expectedAddr) == evm.state().balance(expectedAddr), expectedAddr << ": incorrect balance " << evm.state().balance(expectedAddr) << ", expected " << importer.m_statePost.balance(expectedAddr)); - BOOST_CHECK_MESSAGE(importer.m_statePost.transactionsFrom(expectedAddr) == evm.state().transactionsFrom(expectedAddr), expectedAddr << ": incorrect txCount " << evm.state().transactionsFrom(expectedAddr) << ", expected " << importer.m_statePost.transactionsFrom(expectedAddr)); - BOOST_CHECK_MESSAGE(importer.m_statePost.code(expectedAddr) == evm.state().code(expectedAddr), expectedAddr << ": incorrect code"); - - auto&& expectedStore = importer.m_statePost.storage(expectedAddr); - auto&& resultStore = evm.state().storage(expectedAddr); - - for (auto&& expectedStorePair : expectedStore) - { - auto& expectedStoreKey = expectedStorePair.first; - auto resultStoreIt = resultStore.find(expectedStoreKey); - if (resultStoreIt == resultStore.end()) - BOOST_ERROR(expectedAddr << ": missing store key " << expectedStoreKey); - else - { - auto& expectedStoreValue = expectedStorePair.second; - auto& resultStoreValue = resultStoreIt->second; - BOOST_CHECK_MESSAGE(expectedStoreValue == resultStoreValue, expectedAddr << ": store[" << expectedStoreKey << "] = " << resultStoreValue << ", expected " << expectedStoreValue); - } - } - } - } + BOOST_CHECK_MESSAGE(importer.m_statePost.balance(expectedAddr) == theState.balance(expectedAddr), expectedAddr << ": incorrect balance " << theState.balance(expectedAddr) << ", expected " << importer.m_statePost.balance(expectedAddr)); + BOOST_CHECK_MESSAGE(importer.m_statePost.transactionsFrom(expectedAddr) == theState.transactionsFrom(expectedAddr), expectedAddr << ": incorrect txCount " << theState.transactionsFrom(expectedAddr) << ", expected " << importer.m_statePost.transactionsFrom(expectedAddr)); + BOOST_CHECK_MESSAGE(importer.m_statePost.code(expectedAddr) == theState.code(expectedAddr), expectedAddr << ": incorrect code"); - for (auto& resultPair : resultAddrs) - { - auto& resultAddr = resultPair.first; - auto expectedAddrIt = expectedAddrs.find(resultAddr); - if (expectedAddrIt == expectedAddrs.end()) - BOOST_ERROR("Missing result address " << resultAddr); + checkStorage(importer.m_statePost.storage(expectedAddr), theState.storage(expectedAddr), expectedAddr); + } } - - BOOST_CHECK(evm.state().addresses() == importer.m_statePost.addresses()); // Just to make sure nothing missed - //BOOST_CHECK(evm.callcreates == importer.callcreates); + checkAddresses<map<Address, u256> >(expectedAddrs, resultAddrs); } - } } +} }// Namespace Close +BOOST_AUTO_TEST_SUITE(StateTests) -void executeStateTests(const string& _name) +BOOST_AUTO_TEST_CASE(stExample) { - const char* ptestPath = getenv("ETHEREUM_TEST_PATH"); - string testPath; - - if (ptestPath == NULL) - { - cnote << " could not find environment variable ETHEREUM_TEST_PATH \n"; - testPath = "../../../tests"; - } - else - testPath = ptestPath; - - testPath += "/statetests"; - -#ifdef FILL_TESTS - try - { - cnote << "Populating VM tests..."; - json_spirit::mValue v; - boost::filesystem::path p(__FILE__); - boost::filesystem::path dir = p.parent_path(); - string s = asString(dev::contents(dir.string() + "/" + _name + "Filler.json")); - BOOST_REQUIRE_MESSAGE(s.length() > 0, "Contents of " + dir.string() + "/" + _name + "Filler.json is empty."); - json_spirit::read_string(s, v); - doStateTests(v, true); - writeFile(testPath + "/" + _name + ".json", asBytes(json_spirit::write_string(v, true))); - } - catch (Exception const& _e) - { - BOOST_ERROR("Failed VM Test with Exception: " << diagnostic_information(_e)); - } - catch (std::exception const& _e) - { - BOOST_ERROR("Failed VM Test with Exception: " << _e.what()); - } -#endif - - try - { - cnote << "Testing VM..." << _name; - json_spirit::mValue v; - string s = asString(dev::contents(testPath + "/" + _name + ".json")); - BOOST_REQUIRE_MESSAGE(s.length() > 0, "Contents of " + testPath + "/" + _name + ".json is empty. Have you cloned the 'tests' repo branch develop and set ETHEREUM_TEST_PATH to its path?"); - json_spirit::read_string(s, v); - doStateTests(v, false); - } - catch (Exception const& _e) - { - BOOST_ERROR("Failed VM Test with Exception: " << diagnostic_information(_e)); - } - catch (std::exception const& _e) - { - BOOST_ERROR("Failed VM Test with Exception: " << _e.what()); - } - + dev::test::executeTests("stExample", "/StateTests", dev::test::doStateTests); } -} } }// Namespace Close -BOOST_AUTO_TEST_CASE(vmSystemOperationsTest) -{ - dev::eth::test::executeStateTests("stSystemOperationsTest"); -} +//BOOST_AUTO_TEST_CASE(stSystemOperationsTest) +//{ +// dev::test::executeStateTests("stSystemOperationsTest"); +//} BOOST_AUTO_TEST_CASE(tmp) { - std::cout << "Doing systemoperationsTest in state\n"; int currentVerbosity = g_logVerbosity; g_logVerbosity = 12; - dev::eth::test::executeStateTests("tmp"); + dev::test::executeTests("tmp", "/StateTests", dev::test::doStateTests); g_logVerbosity = currentVerbosity; } +BOOST_AUTO_TEST_SUITE_END() |