aboutsummaryrefslogtreecommitdiffstats
path: root/test/libsolidity
diff options
context:
space:
mode:
authorDimitry <winsvega@mail.ru>2016-06-09 01:22:36 +0800
committerchriseth <c@ethdev.com>2016-06-29 05:18:54 +0800
commit55cfba6514c5d53ebd566799ab9a9ee4e60ed2b0 (patch)
tree4d647bd41d2df6e84652852dfc5e2b1bb428421f /test/libsolidity
parent5aca97af0d7719dea36f4c33df35966e5e83be11 (diff)
downloaddexon-solidity-55cfba6514c5d53ebd566799ab9a9ee4e60ed2b0.tar.gz
dexon-solidity-55cfba6514c5d53ebd566799ab9a9ee4e60ed2b0.tar.zst
dexon-solidity-55cfba6514c5d53ebd566799ab9a9ee4e60ed2b0.zip
test framework
IPC socket and RPC communication with node
Diffstat (limited to 'test/libsolidity')
-rw-r--r--test/libsolidity/solidityExecutionFramework.h105
1 files changed, 43 insertions, 62 deletions
diff --git a/test/libsolidity/solidityExecutionFramework.h b/test/libsolidity/solidityExecutionFramework.h
index a2c6d907..bce073ec 100644
--- a/test/libsolidity/solidityExecutionFramework.h
+++ b/test/libsolidity/solidityExecutionFramework.h
@@ -26,6 +26,7 @@
#include <tuple>
#include <fstream>
#include "../TestHelper.h"
+#include "../IPCSocket.h"
#include <libethcore/ABI.h>
#include <libethcore/SealEngine.h>
#include <libethereum/State.h>
@@ -46,43 +47,27 @@ namespace test
class ExecutionFramework
{
+
public:
ExecutionFramework():
- m_state(0)
+ m_state(0),
+ m_socket("/home/wins/Ethereum/testnet/ethnode1/geth.ipc")
+ //m_socket("/media/www/STUFF/Ethereum/testnet/ethnode1/datadir/geth.ipc")
{
eth::NoProof::init();
m_sealEngine.reset(eth::ChainParams().createSealEngine());
if (g_logVerbosity != -1)
g_logVerbosity = 0;
- //m_state.resetCurrent();
- m_ipcSocket.open("/home/christian/.ethereum/geth.ipc");
- rpcCall("personal_createAccount", {});
- }
-
- void rpcCall(std::string const& _methodName, std::vector<std::string> const& _args)
- {
- if (!m_ipcSocket)
- BOOST_FAIL("Ethereum node unavailable.");
- m_ipcSocket <<
- "{\"jsonrpc\": \"2.0\", \"method\": \"" <<
- _methodName <<
- "\" \"params\": [";
- for (size_t i = 0; i < _args.size(); ++i)
- {
- m_ipcSocket << "\"" << _args[i] << "\"";
- if (i + 1 != _args.size())
- m_ipcSocket << ", ";
- }
- m_ipcSocket << "], \"id\": \"" << m_rpcSequence << "\"}" << std::endl;
- ++m_rpcSequence;
-
- if (!m_ipcSocket)
- BOOST_FAIL("Ethereum node unavailable.");
- std::string reply;
- std::getline(m_ipcSocket, reply);
- std::cout << "Reply: " << reply << std::endl;
- }
+ 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);
+ }
bytes const& compileAndRunWithoutCheck(
std::string const& _sourceCode,
@@ -284,44 +269,38 @@ private:
protected:
void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0)
{
- m_state.addBalance(m_sender, _value); // just in case
- eth::Executive executive(m_state, m_envInfo, m_sealEngine.get());
- eth::ExecutionResult res;
- executive.setResultRecipient(res);
- eth::Transaction t =
- _isCreation ?
- eth::Transaction(_value, m_gasPrice, m_gas, _data, 0, KeyPair::create().sec()) :
- eth::Transaction(_value, m_gasPrice, m_gas, m_contractAddress, _data, 0, KeyPair::create().sec());
- bytes transactionRLP = t.rlp();
- try
- {
- // this will throw since the transaction is invalid, but it should nevertheless store the transaction
- executive.initialize(&transactionRLP);
- executive.execute();
- }
- catch (...) {}
+ 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)
- {
- BOOST_REQUIRE(!executive.create(m_sender, _value, m_gasPrice, m_gas, &_data, m_sender));
- m_contractAddress = executive.newAddress();
- BOOST_REQUIRE(m_contractAddress);
- BOOST_REQUIRE(m_state.addressHasCode(m_contractAddress));
- }
+ d.to = "";
else
+ d.to = dev::toString(m_contractAddress);
+
+ 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)
{
- BOOST_REQUIRE(m_state.addressHasCode(m_contractAddress));
- BOOST_REQUIRE(!executive.call(m_contractAddress, m_sender, _value, m_gasPrice, &_data, m_gas));
+ m_contractAddress = Address(receipt.contractAddress);
+ BOOST_REQUIRE(m_contractAddress);
+ string code = m_socket.eth_getCode(receipt.contractAddress, "latest");
+ BOOST_REQUIRE(code.size() > 2);
}
- BOOST_REQUIRE(executive.go(/* DEBUG eth::Executive::simpleTrace() */));
- m_state.noteSending(m_sender);
- executive.finalize();
- m_gasUsed = res.gasUsed;
- m_output = std::move(res.output);
- m_logs = executive.logs();
- }
+ else
+ BOOST_REQUIRE(code.size() > 2);
- std::fstream m_ipcSocket;
- size_t m_rpcSequence = 1;
+ m_gasUsed = u256(receipt.gasUsed);
+ m_output = fromHex(output, WhenError::Throw);
+ m_logs.clear();
+ }
std::unique_ptr<eth::SealEngineFace> m_sealEngine;
size_t m_optimizeRuns = 200;
@@ -337,6 +316,8 @@ protected:
bytes m_output;
eth::LogEntries m_logs;
u256 m_gasUsed;
+
+ RPCRequest m_socket;
};
}