aboutsummaryrefslogtreecommitdiffstats
path: root/state.cpp
diff options
context:
space:
mode:
authorChristoph Jentzsch <jentzsch.software@gmail.com>2014-11-03 23:33:02 +0800
committerChristoph Jentzsch <jentzsch.software@gmail.com>2014-11-03 23:33:02 +0800
commit6eeef2762c0e784bf0c44793376a70430575d34d (patch)
treed8bc55513734f16a88cdc35dc2469c405e509a36 /state.cpp
parentbc1aaa78a8fc2954e45e5cea9118f61aec16ad80 (diff)
downloaddexon-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.cpp173
1 files changed, 40 insertions, 133 deletions
diff --git a/state.cpp b/state.cpp
index dbb49f94..e3a91a3a 100644
--- a/state.cpp
+++ b/state.cpp
@@ -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()