Refactor testing via IPC.

This commit is contained in:
chriseth
2016-06-28 23:18:54 +02:00
parent ad36fc3c58
commit d6e39054e0
13 changed files with 240 additions and 195 deletions
-5
View File
@@ -1,5 +0,0 @@
cmake_policy(SET CMP0015 NEW)
aux_source_directory(. SRCS)
add_sources(${SRCS})
+1 -1
View File
@@ -20,7 +20,7 @@
* Unit tests for the gas estimator.
*/
#include <test/libsolidity/solidityExecutionFramework.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
#include <libevmasm/GasMeter.h>
#include <libevmasm/KnownState.h>
#include <libevmasm/PathGasMeter.h>
+1 -1
View File
@@ -26,7 +26,7 @@
#include <boost/test/unit_test.hpp>
#include <libdevcore/Hash.h>
#include <libsolidity/interface/Exceptions.h>
#include <test/libsolidity/solidityExecutionFramework.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
using namespace std;
@@ -0,0 +1,77 @@
/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @author Christian <c@ethdev.com>
* @date 2016
* Framework for executing Solidity contracts and testing them against C++ implementation.
*/
#include <test/libsolidity/SolidityExecutionFramework.h>
using namespace std;
using namespace dev;
using namespace dev::solidity;
using namespace dev::solidity::test;
ExecutionFramework::ExecutionFramework():
m_rpc(RPCSession::instance("/tmp/test/geth.ipc")),
m_sender(m_rpc.account(0)),
m_state(0)
{
eth::NoProof::init();
m_sealEngine.reset(eth::ChainParams().createSealEngine());
if (g_logVerbosity != -1)
g_logVerbosity = 0;
cout << "New Framework" << endl;
m_rpc.test_rewindToBlock(0);
}
void ExecutionFramework::sendMessage(bytes const& _data, bool _isCreation, u256 const& _value)
{
RPCSession::TransactionData d;
d.data = "0x" + toHex(_data);
d.from = "0x" + toString(m_sender);
d.gas = toHex(m_gas, HexPrefix::Add);
d.gasPrice = toHex(m_gasPrice, HexPrefix::Add);
d.value = toHex(_value, HexPrefix::Add);
if (!_isCreation)
{
d.to = dev::toString(m_contractAddress);
BOOST_REQUIRE(m_rpc.eth_getCode(d.to, "latest").size() > 2);
// Use eth_call to get the output
m_output = fromHex(m_rpc.eth_call(d, "latest"), WhenError::Throw);
}
string txHash = m_rpc.eth_sendTransaction(d);
m_rpc.test_mineBlocks(1);
RPCSession::TransactionReceipt receipt(m_rpc.eth_getTransactionReceipt(txHash));
if (_isCreation)
{
m_contractAddress = Address(receipt.contractAddress);
BOOST_REQUIRE(m_contractAddress);
string code = m_rpc.eth_getCode(receipt.contractAddress, "latest");
BOOST_REQUIRE(code.size() > 2);
m_output = asBytes(code);
}
m_gasUsed = u256(receipt.gasUsed);
m_logs.clear();
}
@@ -39,7 +39,6 @@
namespace dev
{
namespace solidity
{
namespace test
@@ -49,24 +48,7 @@ class ExecutionFramework
{
public:
ExecutionFramework():
m_state(0),
m_socket("/tmp/test/geth.ipc")
{
eth::NoProof::init();
m_sealEngine.reset(eth::ChainParams().createSealEngine());
if (g_logVerbosity != -1)
g_logVerbosity = 0;
string account = m_socket.personal_newAccount("qwerty");
m_socket.test_setChainParams(
"0x1000000000000000000000000000000000000000",
account,
"1000000000000000000000000000000000000000000000"
);
m_socket.personal_unlockAccount(account, "qwerty", 10000);
m_sender = Address(account);
}
ExecutionFramework();
bytes const& compileAndRunWithoutCheck(
std::string const& _sourceCode,
@@ -267,40 +249,9 @@ private:
}
protected:
void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0)
{
RPCRequest::transactionData d;
d.data = "0x" + toHex(_data);
d.from = "0x" + toString(m_sender);
d.gas = toHex(m_gas, HexPrefix::Add);
d.gasPrice = toHex(m_gasPrice, HexPrefix::Add);
d.value = toHex(_value, HexPrefix::Add);
if (_isCreation)
d.to = "";
else
d.to = dev::toString(m_contractAddress);
void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0);
string code = m_socket.eth_getCode(d.to, "latest");
string output = m_socket.eth_call(d, "latest");
string hash = m_socket.eth_sendTransaction(d);
m_socket.test_mineBlocks(1);
RPCRequest::transactionReceipt receipt;
receipt = m_socket.eth_getTransactionReceipt(hash);
if (_isCreation)
{
m_contractAddress = Address(receipt.contractAddress);
BOOST_REQUIRE(m_contractAddress);
string code = m_socket.eth_getCode(receipt.contractAddress, "latest");
BOOST_REQUIRE(code.size() > 2);
}
else
BOOST_REQUIRE(code.size() > 2);
m_gasUsed = u256(receipt.gasUsed);
m_output = fromHex(output, WhenError::Throw);
m_logs.clear();
}
RPCSession& m_rpc;
std::unique_ptr<eth::SealEngineFace> m_sealEngine;
size_t m_optimizeRuns = 200;
@@ -316,8 +267,6 @@ protected:
bytes m_output;
eth::LogEntries m_logs;
u256 m_gasUsed;
RPCRequest m_socket;
};
}
+1 -1
View File
@@ -25,7 +25,7 @@
#include <memory>
#include <boost/test/unit_test.hpp>
#include <boost/lexical_cast.hpp>
#include <test/libsolidity/solidityExecutionFramework.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
#include <libevmasm/CommonSubexpressionEliminator.h>
#include <libevmasm/ControlFlowGraph.h>
#include <libevmasm/Assembly.h>