aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorBob Summerwill <bob@summerwill.net>2016-08-01 13:25:37 +0800
committerBob Summerwill <bob@summerwill.net>2016-08-01 16:45:11 +0800
commit4ee2114127f87b08b76b3ca94cde80a49cdc056a (patch)
treeb680926d0da4aadfddae0db9567557802f2c2929 /test
parent56727d61a61e1485c8360f00700d766632ec7163 (diff)
downloaddexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar.gz
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar.bz2
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar.lz
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar.xz
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.tar.zst
dexon-solidity-4ee2114127f87b08b76b3ca94cde80a49cdc056a.zip
Make the Solidity repository standalone.
This commit is the culmination of several months of work to decouple Solidity from the webthree-umbrella so that it can be developed in parallel with cpp-ethereum (the Ethereum C++ runtime) and so that even for the Solidity unit-tests there is no hard-dependency onto the C++ runtime. The Tests-over-IPC refactoring was a major step in the same process which was already committed. This commit contains the following changes: - A subset of the CMake functionality in webthree-helpers was extracted and tailored for Solidity into ./cmake. Further cleanup is certainly possible. - A subset of the libdevcore functionality in libweb3core was extracted and tailored for Solidity into ./libdevcore. Further cleanup is certainly possible - The gas price constants in EVMSchedule were orphaned into libevmasm. - Some other refactorings and cleanups were made to sever unnecessary EVM dependencies in the Solidity unit-tests. - TravisCI and Appveyor support was added, covering builds and running of the unit-tests (Linux and macOS only for now) - A bug-fix was made to get the Tests-over-IPC running on macOS. - There are still reliability issues in the unit-tests, which need immediate attention. The Travis build has been flipped to run the unit-tests 5 times, to try to flush these out. - The Emscripten automation which was previously in webthree-umbrella was merged into the TravisCI automation here. - The development ZIP deployment step has been commented out, but we will want to read that ONLY for release branch. Further iteration on these changes will definitely be needed, but I feel these have got to sufficient maturity than holding them back further isn't winning us anything. It is go time :-)
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt2
-rw-r--r--test/RPCSession.cpp16
-rw-r--r--test/contracts/AuctionRegistrar.cpp12
-rw-r--r--test/contracts/FixedFeeRegistrar.cpp6
-rw-r--r--test/contracts/Wallet.cpp30
-rw-r--r--test/libsolidity/GasMeter.cpp1
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp8
-rw-r--r--test/libsolidity/SolidityExecutionFramework.cpp11
-rw-r--r--test/libsolidity/SolidityExecutionFramework.h31
9 files changed, 71 insertions, 46 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index efcbb82e..2f001b21 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -26,7 +26,7 @@ file(GLOB HEADERS "*.h" "*/*.h")
set(EXECUTABLE soltest)
eth_simple_add_executable(${EXECUTABLE} ${SRC_LIST} ${HEADERS})
-eth_use(${EXECUTABLE} REQUIRED Solidity::solidity Eth::ethcore)
+eth_use(${EXECUTABLE} REQUIRED Solidity::solidity)
include_directories(BEFORE ..)
target_link_libraries(${EXECUTABLE} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARIES})
diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp
index 54e1675f..e9df9031 100644
--- a/test/RPCSession.cpp
+++ b/test/RPCSession.cpp
@@ -36,15 +36,25 @@ IPCSocket::IPCSocket(string const& _path): m_path(_path)
BOOST_FAIL("Error opening IPC: socket path is too long!");
struct sockaddr_un saun;
+ memset(&saun, 0, sizeof(sockaddr_un));
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, _path.c_str());
+// http://idletechnology.blogspot.ca/2011/12/unix-domain-sockets-on-osx.html
+//
+// SUN_LEN() might be optimal, but it seemingly affects the portability,
+// with at least Android missing this macro. Just using the sizeof() for
+// structure seemingly works, and would only have the side-effect of
+// sending larger-than-required packets over the socket. Given that this
+// code is only used for unit-tests, that approach seems simpler.
+#if defined(__APPLE__)
+ saun.sun_len = sizeof(struct sockaddr_un);
+#endif // defined(__APPLE__)
+
if ((m_socket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
BOOST_FAIL("Error creating IPC socket object");
- int len = sizeof(saun.sun_family) + strlen(saun.sun_path);
-
- if (connect(m_socket, reinterpret_cast<struct sockaddr const*>(&saun), len) < 0)
+ if (connect(m_socket, reinterpret_cast<struct sockaddr const*>(&saun), sizeof(struct sockaddr_un)) < 0)
BOOST_FAIL("Error connecting to IPC socket: " << _path);
m_fp = fdopen(m_socket, "r");
diff --git a/test/contracts/AuctionRegistrar.cpp b/test/contracts/AuctionRegistrar.cpp
index 9aa47189..8860727d 100644
--- a/test/contracts/AuctionRegistrar.cpp
+++ b/test/contracts/AuctionRegistrar.cpp
@@ -23,8 +23,8 @@
#include <string>
#include <tuple>
#include <boost/test/unit_test.hpp>
+#include <libdevcore/ABI.h>
#include <libdevcore/Hash.h>
-#include <libethcore/ABI.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
using namespace std;
@@ -333,7 +333,7 @@ BOOST_AUTO_TEST_CASE(double_reserve_long)
registrar.reserve(name);
BOOST_CHECK_EQUAL(registrar.owner(name), m_sender);
- sendEther(account(1), u256(10) * eth::ether);
+ sendEther(account(1), u256(10) * ether);
m_sender = account(1);
registrar.reserve(name);
BOOST_CHECK_EQUAL(registrar.owner(name), account(0));
@@ -350,7 +350,7 @@ BOOST_AUTO_TEST_CASE(properties)
for (string const& name: names)
{
m_sender = account(0);
- sendEther(account(count), u256(20) * eth::ether);
+ sendEther(account(count), u256(20) * ether);
m_sender = account(count);
auto sender = m_sender;
addr += count;
@@ -402,7 +402,7 @@ BOOST_AUTO_TEST_CASE(disown)
BOOST_CHECK_EQUAL(registrar.name(u160(124)), name);
// someone else tries disowning
- sendEther(account(1), u256(10) * eth::ether);
+ sendEther(account(1), u256(10) * ether);
m_sender = account(1);
registrar.disown(name);
BOOST_CHECK_EQUAL(registrar.owner(name), account(0));
@@ -451,7 +451,7 @@ BOOST_AUTO_TEST_CASE(auction_bidding)
registrar.setNextValue(12);
registrar.reserve(name);
// another bid by someone else
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
m_rpc.test_modifyTimestamp(startTime + 2 * m_biddingTime - 50);
registrar.setNextValue(13);
@@ -480,7 +480,7 @@ BOOST_AUTO_TEST_CASE(auction_renewal)
BOOST_CHECK_EQUAL(registrar.owner(name), m_sender);
// try to re-register before interval end
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
m_rpc.test_modifyTimestamp(currentTimestamp() + m_renewalInterval - 1);
registrar.setNextValue(80);
diff --git a/test/contracts/FixedFeeRegistrar.cpp b/test/contracts/FixedFeeRegistrar.cpp
index 8cb8257a..63db0531 100644
--- a/test/contracts/FixedFeeRegistrar.cpp
+++ b/test/contracts/FixedFeeRegistrar.cpp
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE(double_reserve)
BOOST_REQUIRE(callContractFunctionWithValue("reserve(string)", m_fee, encodeDyn(name)) == encodeArgs());
BOOST_CHECK(callContractFunction("owner(string)", encodeDyn(name)) == encodeArgs(h256(account(0), h256::AlignRight)));
- sendEther(account(1), 100 * eth::ether);
+ sendEther(account(1), 100 * ether);
m_sender = account(1);
BOOST_REQUIRE(callContractFunctionWithValue("reserve(string)", m_fee, encodeDyn(name)) == encodeArgs());
BOOST_CHECK(callContractFunction("owner(string)", encodeDyn(name)) == encodeArgs(h256(account(0), h256::AlignRight)));
@@ -191,7 +191,7 @@ BOOST_AUTO_TEST_CASE(properties)
{
addr++;
m_sender = account(0);
- sendEther(account(count), 100 * eth::ether);
+ sendEther(account(count), 100 * ether);
m_sender = account(count);
Address owner = m_sender;
// setting by sender works
@@ -206,7 +206,7 @@ BOOST_AUTO_TEST_CASE(properties)
count++;
// but not by someone else
m_sender = account(0);
- sendEther(account(count), 100 * eth::ether);
+ sendEther(account(count), 100 * ether);
m_sender = account(count);
BOOST_CHECK(callContractFunction("owner(string)", encodeDyn(name)) == encodeArgs(h256(owner, h256::AlignRight)));
BOOST_CHECK(callContractFunction("setAddr(string,address)", u256(0x40), addr + 1, u256(name.length()), name) == encodeArgs());
diff --git a/test/contracts/Wallet.cpp b/test/contracts/Wallet.cpp
index fbab2404..27bdb396 100644
--- a/test/contracts/Wallet.cpp
+++ b/test/contracts/Wallet.cpp
@@ -474,13 +474,13 @@ BOOST_AUTO_TEST_CASE(add_owners)
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(account(1), h256::AlignRight)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(account(1), h256::AlignRight)) == encodeArgs(true));
// now let the new owner add someone
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x13)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x13)) == encodeArgs(true));
// and check that a non-owner cannot add a new owner
m_sender = account(0);
- sendEther(account(2), 10 * eth::ether);
+ sendEther(account(2), 10 * ether);
m_sender = account(2);
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x20)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x20)) == encodeArgs(false));
@@ -559,17 +559,17 @@ BOOST_AUTO_TEST_CASE(multisig_value_transfer)
// check that balance is and stays zero at destination address
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
auto ophash = callContractFunction("execute(address,uint256,bytes)", h256(0x05), 100, 0x60, 0x00);
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(2), 10 * eth::ether);
+ sendEther(account(2), 10 * ether);
m_sender = account(2);
callContractFunction("confirm(bytes32)", ophash);
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(3), 10 * eth::ether);
+ sendEther(account(3), 10 * ether);
m_sender = account(3);
callContractFunction("confirm(bytes32)", ophash);
// now it should go through
@@ -590,7 +590,7 @@ BOOST_AUTO_TEST_CASE(revoke_addOwner)
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x33)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x33)) == encodeArgs(false));
m_sender = account(0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x33)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x33)) == encodeArgs(false));
@@ -598,12 +598,12 @@ BOOST_AUTO_TEST_CASE(revoke_addOwner)
m_sender = deployer;
BOOST_REQUIRE(callContractFunction("revoke(bytes32)", opHash) == encodeArgs());
m_sender = account(0);
- sendEther(account(2), 10 * eth::ether);
+ sendEther(account(2), 10 * ether);
m_sender = account(2);
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x33)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x33)) == encodeArgs(false));
m_sender = account(0);
- sendEther(account(3), 10 * eth::ether);
+ sendEther(account(3), 10 * ether);
m_sender = account(3);
BOOST_REQUIRE(callContractFunction("addOwner(address)", h256(0x33)) == encodeArgs());
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(0x33)) == encodeArgs(true));
@@ -621,24 +621,24 @@ BOOST_AUTO_TEST_CASE(revoke_transaction)
Address deployer = m_sender;
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
auto opHash = callContractFunction("execute(address,uint256,bytes)", h256(0x05), 100, 0x60, 0x00);
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(2), 10 * eth::ether);
+ sendEther(account(2), 10 * ether);
m_sender = account(2);
callContractFunction("confirm(bytes32)", opHash);
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
BOOST_REQUIRE(callContractFunction("revoke(bytes32)", opHash) == encodeArgs());
m_sender = deployer;
callContractFunction("confirm(bytes32)", opHash);
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
m_sender = account(0);
- sendEther(account(3), 10 * eth::ether);
+ sendEther(account(3), 10 * ether);
m_sender = account(3);
callContractFunction("confirm(bytes32)", opHash);
// now it should go through
@@ -659,7 +659,7 @@ BOOST_AUTO_TEST_CASE(daylimit)
// try to send tx over daylimit
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
m_sender = account(1);
BOOST_REQUIRE(
callContractFunction("execute(address,uint256,bytes)", h256(0x05), 150, 0x60, 0x00) !=
@@ -668,7 +668,7 @@ BOOST_AUTO_TEST_CASE(daylimit)
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
// try to send tx under daylimit by stranger
m_sender = account(0);
- sendEther(account(4), 10 * eth::ether);
+ sendEther(account(4), 10 * ether);
m_sender = account(4);
BOOST_REQUIRE(
callContractFunction("execute(address,uint256,bytes)", h256(0x05), 90, 0x60, 0x00) ==
@@ -677,7 +677,7 @@ BOOST_AUTO_TEST_CASE(daylimit)
BOOST_CHECK_EQUAL(balanceAt(Address(0x05)), 0);
// now send below limit by owner
m_sender = account(0);
- sendEther(account(1), 10 * eth::ether);
+ sendEther(account(1), 10 * ether);
BOOST_REQUIRE(
callContractFunction("execute(address,uint256,bytes)", h256(0x05), 90, 0x60, 0x00) ==
encodeArgs(u256(0))
diff --git a/test/libsolidity/GasMeter.cpp b/test/libsolidity/GasMeter.cpp
index fc7a033f..41204a0a 100644
--- a/test/libsolidity/GasMeter.cpp
+++ b/test/libsolidity/GasMeter.cpp
@@ -21,6 +21,7 @@
*/
#include <test/libsolidity/SolidityExecutionFramework.h>
+#include <libevmasm/EVMSchedule.h>
#include <libevmasm/GasMeter.h>
#include <libevmasm/KnownState.h>
#include <libevmasm/PathGasMeter.h>
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 4b634649..1b7c5ea4 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -21,6 +21,7 @@
* Unit tests for the solidity expression compiler, testing the behaviour of the code.
*/
+#include <functional>
#include <string>
#include <tuple>
#include <boost/test/unit_test.hpp>
@@ -29,6 +30,7 @@
#include <test/libsolidity/SolidityExecutionFramework.h>
using namespace std;
+using namespace std::placeholders;
namespace dev
{
@@ -2462,7 +2464,7 @@ BOOST_AUTO_TEST_CASE(use_std_lib)
contract Icarus is mortal { }
)";
m_addStandardSources = true;
- u256 amount(130 * eth::ether);
+ u256 amount(130 * ether);
compileAndRun(sourceCode, amount, "Icarus");
u256 balanceBefore = balanceAt(m_sender);
BOOST_CHECK(callContractFunction("kill()") == bytes());
@@ -5921,9 +5923,9 @@ BOOST_AUTO_TEST_CASE(version_stamp_for_libraries)
m_optimize = true;
bytes runtimeCode = compileAndRun(sourceCode, 0, "lib");
BOOST_CHECK(runtimeCode.size() >= 8);
- BOOST_CHECK_EQUAL(runtimeCode[0], int(eth::Instruction::PUSH6)); // might change once we switch to 1.x.x
+ BOOST_CHECK_EQUAL(runtimeCode[0], int(Instruction::PUSH6)); // might change once we switch to 1.x.x
BOOST_CHECK_EQUAL(runtimeCode[1], 3); // might change once we switch away from x.3.x
- BOOST_CHECK_EQUAL(runtimeCode[7], int(eth::Instruction::POP));
+ BOOST_CHECK_EQUAL(runtimeCode[7], int(Instruction::POP));
}
BOOST_AUTO_TEST_CASE(contract_binary_dependencies)
diff --git a/test/libsolidity/SolidityExecutionFramework.cpp b/test/libsolidity/SolidityExecutionFramework.cpp
index da9cf5f1..a33f4caf 100644
--- a/test/libsolidity/SolidityExecutionFramework.cpp
+++ b/test/libsolidity/SolidityExecutionFramework.cpp
@@ -22,13 +22,21 @@
#include <cstdlib>
#include <boost/test/framework.hpp>
+#include <libdevcore/CommonIO.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
+
+
using namespace std;
using namespace dev;
using namespace dev::solidity;
using namespace dev::solidity::test;
+namespace // anonymous
+{
+ h256 const EmptyTrie("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421");
+}
+
string getIPCSocketPath()
{
string ipcPath;
@@ -56,9 +64,6 @@ ExecutionFramework::ExecutionFramework() :
m_rpc(RPCSession::instance(getIPCSocketPath())),
m_sender(m_rpc.account(0))
{
- if (g_logVerbosity != -1)
- g_logVerbosity = 0;
-
m_rpc.test_rewindToBlock(0);
}
diff --git a/test/libsolidity/SolidityExecutionFramework.h b/test/libsolidity/SolidityExecutionFramework.h
index 2b589498..5764784a 100644
--- a/test/libsolidity/SolidityExecutionFramework.h
+++ b/test/libsolidity/SolidityExecutionFramework.h
@@ -22,25 +22,33 @@
#pragma once
-#include <string>
-#include <tuple>
-#include <fstream>
+#include <functional>
+
#include "../TestHelper.h"
#include "../RPCSession.h"
-#include <libethcore/ABI.h>
-#include <libethcore/SealEngine.h>
-#include <libethereum/State.h>
-#include <libethereum/Executive.h>
-#include <libethereum/ChainParams.h>
+
+#include <libdevcore/ABI.h>
+#include <libdevcore/FixedHash.h>
+#include <libevmasm/Instruction.h>
+
#include <libsolidity/interface/CompilerStack.h>
#include <libsolidity/interface/Exceptions.h>
-#include <libethcore/BasicAuthority.h>
-#include <libethcore/SealEngine.h>
namespace dev
{
namespace solidity
{
+ /// An Ethereum address: 20 bytes.
+ /// @NOTE This is not endian-specific; it's just a bunch of bytes.
+ using Address = h160;
+
+ // The various denominations; here for ease of use where needed within code.
+ static const u256 ether = exp10<18>();
+ static const u256 finney = exp10<15>();
+ static const u256 szabo = exp10<12>();
+ static const u256 shannon = exp10<9>();
+ static const u256 wei = exp10<0>();
+
namespace test
{
@@ -275,8 +283,7 @@ protected:
dev::solidity::CompilerStack m_compiler;
Address m_sender;
Address m_contractAddress;
- eth::EnvInfo m_envInfo;
- u256 const m_gasPrice = 100 * eth::szabo;
+ u256 const m_gasPrice = 100 * szabo;
u256 const m_gas = 100000000;
bytes m_output;
std::vector<LogEntry> m_logs;