mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
added logs to state tests
This commit is contained in:
parent
366514a725
commit
d952833c1b
@ -72,6 +72,7 @@ ImportTest::ImportTest(json_spirit::mObject& _o, bool isFiller): m_TestObject(_o
|
||||
if (!isFiller)
|
||||
{
|
||||
importState(_o["post"].get_obj(), m_statePost);
|
||||
m_environment.sub.logs = importLog(_o["logs"].get_obj());
|
||||
}
|
||||
}
|
||||
|
||||
@ -95,6 +96,7 @@ void ImportTest::importEnv(json_spirit::mObject& _o)
|
||||
m_statePre.m_currentBlock = m_environment.currentBlock;
|
||||
}
|
||||
|
||||
|
||||
void ImportTest::importState(json_spirit::mObject& _o, State& _state)
|
||||
{
|
||||
for (auto& i: _o)
|
||||
@ -148,6 +150,9 @@ void ImportTest::exportTest(bytes _output, State& _statePost)
|
||||
// export output
|
||||
m_TestObject["out"] = "0x" + toHex(_output);
|
||||
|
||||
// export logs
|
||||
m_TestObject["logs"] = exportLog(_statePost.pending().size() ? _statePost.log(0) : LogEntries());
|
||||
|
||||
// export post state
|
||||
json_spirit::mObject postState;
|
||||
|
||||
@ -255,6 +260,44 @@ bytes importCode(json_spirit::mObject& _o)
|
||||
return code;
|
||||
}
|
||||
|
||||
LogEntries importLog(json_spirit::mObject& _o)
|
||||
{
|
||||
LogEntries logEntries;
|
||||
for (auto const& l: _o)
|
||||
{
|
||||
json_spirit::mObject o = l.second.get_obj();
|
||||
// cant use BOOST_REQUIRE, because this function is used outside boost test (createRandomTest)
|
||||
assert(o.count("address") > 0);
|
||||
assert(o.count("topics") > 0);
|
||||
assert(o.count("data") > 0);
|
||||
LogEntry log;
|
||||
log.address = Address(o["address"].get_str());
|
||||
for (auto const& t: o["topics"].get_array())
|
||||
log.topics.insert(h256(t.get_str()));
|
||||
log.data = importData(o);
|
||||
logEntries.push_back(log);
|
||||
}
|
||||
return logEntries;
|
||||
}
|
||||
|
||||
json_spirit::mObject exportLog(eth::LogEntries _logs)
|
||||
{
|
||||
json_spirit::mObject ret;
|
||||
if (_logs.size() == 0) return ret;
|
||||
for (LogEntry const& l: _logs)
|
||||
{
|
||||
json_spirit::mObject o;
|
||||
o["address"] = toString(l.address);
|
||||
json_spirit::mArray topics;
|
||||
for (auto const& t: l.topics)
|
||||
topics.push_back(toString(t));
|
||||
o["topics"] = topics;
|
||||
o["data"] = "0x" + toHex(l.data);
|
||||
ret[toString(l.bloom())] = o;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void checkOutput(bytes const& _output, json_spirit::mObject& _o)
|
||||
{
|
||||
int j = 0;
|
||||
|
@ -68,6 +68,8 @@ u256 toInt(json_spirit::mValue const& _v);
|
||||
byte toByte(json_spirit::mValue const& _v);
|
||||
bytes importCode(json_spirit::mObject& _o);
|
||||
bytes importData(json_spirit::mObject& _o);
|
||||
eth::LogEntries importLog(json_spirit::mObject& _o);
|
||||
json_spirit::mObject exportLog(eth::LogEntries _logs);
|
||||
void checkOutput(bytes const& _output, json_spirit::mObject& _o);
|
||||
void checkStorage(std::map<u256, u256> _expectedStore, std::map<u256, u256> _resultStore, Address _expectedAddr);
|
||||
void checkLog(eth::LogEntries _resultLogs, eth::LogEntries _expectedLogs);
|
||||
|
37
stExampleFiller.json
Normal file
37
stExampleFiller.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"add11" : {
|
||||
"env" : {
|
||||
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
|
||||
"currentDifficulty" : "256",
|
||||
"currentGasLimit" : "1000000",
|
||||
"currentNumber" : "0",
|
||||
"currentTimestamp" : 1,
|
||||
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
|
||||
},
|
||||
"pre" : {
|
||||
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||
"balance" : "1000000000000000000",
|
||||
"code" : "0x6001600101600055",
|
||||
"nonce" : "0",
|
||||
"storage" : {
|
||||
}
|
||||
},
|
||||
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||
"balance" : "1000000000000000000",
|
||||
"code" : "0x",
|
||||
"nonce" : "0",
|
||||
"storage" : {
|
||||
}
|
||||
}
|
||||
},
|
||||
"transaction" : {
|
||||
"data" : "",
|
||||
"gasLimit" : "10000",
|
||||
"gasPrice" : "1",
|
||||
"nonce" : "0",
|
||||
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||
"value" : "100000"
|
||||
}
|
||||
}
|
||||
}
|
@ -81,6 +81,9 @@ void doStateTests(json_spirit::mValue& v, bool _fillin)
|
||||
// check output
|
||||
checkOutput(output, o);
|
||||
|
||||
// check logs
|
||||
checkLog(theState.pending().size() ? theState.log(0) : LogEntries(), importer.m_environment.sub.logs);
|
||||
|
||||
// check addresses
|
||||
auto expectedAddrs = importer.m_statePost.addresses();
|
||||
auto resultAddrs = theState.addresses();
|
||||
|
39
vm.cpp
39
vm.cpp
@ -120,41 +120,6 @@ void FakeExtVM::importEnv(mObject& _o)
|
||||
currentBlock.coinbaseAddress = Address(_o["currentCoinbase"].get_str());
|
||||
}
|
||||
|
||||
mObject FakeExtVM::exportLog()
|
||||
{
|
||||
mObject ret;
|
||||
for (LogEntry const& l: sub.logs)
|
||||
{
|
||||
mObject o;
|
||||
o["address"] = toString(l.address);
|
||||
mArray topics;
|
||||
for (auto const& t: l.topics)
|
||||
topics.push_back(toString(t));
|
||||
o["topics"] = topics;
|
||||
o["data"] = "0x" + toHex(l.data);
|
||||
ret[toString(l.bloom())] = o;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void FakeExtVM::importLog(mObject& _o)
|
||||
{
|
||||
for (auto const& l: _o)
|
||||
{
|
||||
mObject o = l.second.get_obj();
|
||||
// cant use BOOST_REQUIRE, because this function is used outside boost test (createRandomTest)
|
||||
assert(o.count("address") > 0);
|
||||
assert(o.count("topics") > 0);
|
||||
assert(o.count("data") > 0);
|
||||
LogEntry log;
|
||||
log.address = Address(o["address"].get_str());
|
||||
for (auto const& t: o["topics"].get_array())
|
||||
log.topics.insert(h256(t.get_str()));
|
||||
log.data = importData(o);
|
||||
sub.logs.push_back(log);
|
||||
}
|
||||
}
|
||||
|
||||
mObject FakeExtVM::exportState()
|
||||
{
|
||||
mObject ret;
|
||||
@ -384,7 +349,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
||||
o["callcreates"] = fev.exportCallCreates();
|
||||
o["out"] = "0x" + toHex(output);
|
||||
fev.push(o, "gas", gas);
|
||||
o["logs"] = mValue(fev.exportLog());
|
||||
o["logs"] = mValue(exportLog(fev.sub.logs));
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -402,7 +367,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
||||
dev::test::FakeExtVM test;
|
||||
test.importState(o["post"].get_obj());
|
||||
test.importCallCreates(o["callcreates"].get_array());
|
||||
test.importLog(o["logs"].get_obj());
|
||||
test.sub.logs = importLog(o["logs"].get_obj());
|
||||
|
||||
checkOutput(output, o);
|
||||
|
||||
|
2
vm.h
2
vm.h
@ -66,8 +66,6 @@ public:
|
||||
u256 doPosts();
|
||||
json_spirit::mObject exportEnv();
|
||||
void importEnv(json_spirit::mObject& _o);
|
||||
json_spirit::mObject exportLog();
|
||||
void importLog(json_spirit::mObject& _o);
|
||||
json_spirit::mObject exportState();
|
||||
void importState(json_spirit::mObject& _object);
|
||||
json_spirit::mObject exportExec();
|
||||
|
Loading…
Reference in New Issue
Block a user