aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-02-13 21:54:06 +0800
committerGitHub <noreply@github.com>2017-02-13 21:54:06 +0800
commite2349f9d5db80e57558ddaf7564ea57cf3b216d8 (patch)
treeba0723e33dcc1cb88100cbae20f5fe5264b4888e
parenta78667e3062bba4ace52cef6fcb3a5285c3052aa (diff)
parenta82acba49ae68a960f33a2938f3d3560bf65441c (diff)
downloaddexon-solidity-e2349f9d5db80e57558ddaf7564ea57cf3b216d8.tar.gz
dexon-solidity-e2349f9d5db80e57558ddaf7564ea57cf3b216d8.tar.zst
dexon-solidity-e2349f9d5db80e57558ddaf7564ea57cf3b216d8.zip
Merge pull request #1676 from ethereum/test-modifytimestamp
Add blockTimestamp and do not rely on mining time (soltest)
-rw-r--r--test/ExecutionFramework.cpp10
-rw-r--r--test/ExecutionFramework.h2
-rw-r--r--test/RPCSession.cpp11
-rw-r--r--test/RPCSession.h2
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp10
5 files changed, 30 insertions, 5 deletions
diff --git a/test/ExecutionFramework.cpp b/test/ExecutionFramework.cpp
index ddcd9cb6..f4e5fcef 100644
--- a/test/ExecutionFramework.cpp
+++ b/test/ExecutionFramework.cpp
@@ -82,6 +82,8 @@ void ExecutionFramework::sendMessage(bytes const& _data, bool _isCreation, u256
m_rpc.test_mineBlocks(1);
RPCSession::TransactionReceipt receipt(m_rpc.eth_getTransactionReceipt(txHash));
+ m_blockNumber = u256(receipt.blockNumber);
+
if (_isCreation)
{
m_contractAddress = Address(receipt.contractAddress);
@@ -125,7 +127,13 @@ void ExecutionFramework::sendEther(Address const& _to, u256 const& _value)
size_t ExecutionFramework::currentTimestamp()
{
- auto latestBlock = m_rpc.rpcCall("eth_getBlockByNumber", {"\"latest\"", "false"});
+ auto latestBlock = m_rpc.eth_getBlockByNumber("latest", false);
+ return size_t(u256(latestBlock.get("timestamp", "invalid").asString()));
+}
+
+size_t ExecutionFramework::blockTimestamp(u256 _number)
+{
+ auto latestBlock = m_rpc.eth_getBlockByNumber(toString(_number), false);
return size_t(u256(latestBlock.get("timestamp", "invalid").asString()));
}
diff --git a/test/ExecutionFramework.h b/test/ExecutionFramework.h
index 733fd56d..76d0fd8c 100644
--- a/test/ExecutionFramework.h
+++ b/test/ExecutionFramework.h
@@ -262,6 +262,7 @@ protected:
void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0);
void sendEther(Address const& _to, u256 const& _value);
size_t currentTimestamp();
+ size_t blockTimestamp(u256 number);
/// @returns the (potentially newly created) _ith address.
Address account(size_t _i);
@@ -284,6 +285,7 @@ protected:
bool m_showMessages = false;
Address m_sender;
Address m_contractAddress;
+ u256 m_blockNumber;
u256 const m_gasPrice = 100 * szabo;
u256 const m_gas = 100000000;
bytes m_output;
diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp
index b3451528..c27e73d4 100644
--- a/test/RPCSession.cpp
+++ b/test/RPCSession.cpp
@@ -131,6 +131,12 @@ string RPCSession::eth_getCode(string const& _address, string const& _blockNumbe
return rpcCall("eth_getCode", { quote(_address), quote(_blockNumber) }).asString();
}
+Json::Value RPCSession::eth_getBlockByNumber(string const& _blockNumber, bool _fullObjects)
+{
+ // NOTE: to_string() converts bool to 0 or 1
+ return rpcCall("eth_getBlockByNumber", { quote(_blockNumber), _fullObjects ? "true" : "false" });
+}
+
RPCSession::TransactionReceipt RPCSession::eth_getTransactionReceipt(string const& _transactionHash)
{
TransactionReceipt receipt;
@@ -138,6 +144,7 @@ RPCSession::TransactionReceipt RPCSession::eth_getTransactionReceipt(string cons
BOOST_REQUIRE(!result.isNull());
receipt.gasUsed = result["gasUsed"].asString();
receipt.contractAddress = result["contractAddress"].asString();
+ receipt.blockNumber = result["blockNumber"].asString();
for (auto const& log: result["logs"])
{
LogEntry entry;
@@ -289,9 +296,9 @@ Json::Value RPCSession::rpcCall(string const& _methodName, vector<string> const&
request += "],\"id\":" + to_string(m_rpcSequence) + "}";
++m_rpcSequence;
- //cout << "Request: " << request << endl;
+ // cout << "Request: " << request << endl;
string reply = m_ipcSocket.sendRequest(request);
- //cout << "Reply: " << reply << endl;
+ // cout << "Reply: " << reply << endl;
Json::Value result;
BOOST_REQUIRE(Json::Reader().parse(reply, result, false));
diff --git a/test/RPCSession.h b/test/RPCSession.h
index f1aee6a8..105ba378 100644
--- a/test/RPCSession.h
+++ b/test/RPCSession.h
@@ -92,11 +92,13 @@ public:
std::string gasUsed;
std::string contractAddress;
std::vector<LogEntry> logEntries;
+ std::string blockNumber;
};
static RPCSession& instance(std::string const& _path);
std::string eth_getCode(std::string const& _address, std::string const& _blockNumber);
+ Json::Value eth_getBlockByNumber(std::string const& _blockNumber, bool _fullObjects);
std::string eth_call(TransactionData const& _td, std::string const& _blockNumber);
TransactionReceipt eth_getTransactionReceipt(std::string const& _transactionHash);
std::string eth_sendTransaction(TransactionData const& _transactionData);
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index e49db34e..ad045881 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -1482,9 +1482,15 @@ BOOST_AUTO_TEST_CASE(now)
}
}
)";
- m_rpc.test_modifyTimestamp(0x776347e2);
compileAndRun(sourceCode);
- BOOST_CHECK(callContractFunction("someInfo()") == encodeArgs(true, 0x776347e3));
+ u256 startBlock = m_blockNumber;
+ size_t startTime = blockTimestamp(startBlock);
+ auto ret = callContractFunction("someInfo()");
+ u256 endBlock = m_blockNumber;
+ size_t endTime = blockTimestamp(endBlock);
+ BOOST_CHECK(startBlock != endBlock);
+ BOOST_CHECK(startTime != endTime);
+ BOOST_CHECK(ret == encodeArgs(true, endTime));
}
BOOST_AUTO_TEST_CASE(type_conversions_cleanup)