mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge branch 'develop' into p2p
This commit is contained in:
commit
4869ec7951
@ -76,6 +76,7 @@ BOOST_AUTO_TEST_CASE(basic_test)
|
|||||||
char const* interface = R"([
|
char const* interface = R"([
|
||||||
{
|
{
|
||||||
"name": "f",
|
"name": "f",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "a",
|
"name": "a",
|
||||||
@ -114,6 +115,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods)
|
|||||||
char const* interface = R"([
|
char const* interface = R"([
|
||||||
{
|
{
|
||||||
"name": "f",
|
"name": "f",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "a",
|
"name": "a",
|
||||||
@ -129,6 +131,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods)
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "g",
|
"name": "g",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "b",
|
"name": "b",
|
||||||
@ -156,6 +159,7 @@ BOOST_AUTO_TEST_CASE(multiple_params)
|
|||||||
char const* interface = R"([
|
char const* interface = R"([
|
||||||
{
|
{
|
||||||
"name": "f",
|
"name": "f",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "a",
|
"name": "a",
|
||||||
@ -189,6 +193,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order)
|
|||||||
char const* interface = R"([
|
char const* interface = R"([
|
||||||
{
|
{
|
||||||
"name": "c",
|
"name": "c",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "b",
|
"name": "b",
|
||||||
@ -204,6 +209,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order)
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "f",
|
"name": "f",
|
||||||
|
"constant": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"name": "a",
|
"name": "a",
|
||||||
@ -222,6 +228,53 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order)
|
|||||||
checkInterface(sourceCode, interface);
|
checkInterface(sourceCode, interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(const_function)
|
||||||
|
{
|
||||||
|
char const* sourceCode = "contract test {\n"
|
||||||
|
" function foo(uint a, uint b) returns(uint d) { return a + b; }\n"
|
||||||
|
" function boo(uint32 a) const returns(uint b) { return a * 4; }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
char const* interface = R"([
|
||||||
|
{
|
||||||
|
"name": "boo",
|
||||||
|
"constant": true,
|
||||||
|
"inputs": [{
|
||||||
|
"name": "a",
|
||||||
|
"type": "uint32"
|
||||||
|
}],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "b",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "foo",
|
||||||
|
"constant": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"name": "a",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "b",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "d",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
])";
|
||||||
|
|
||||||
|
checkInterface(sourceCode, interface);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -504,6 +504,41 @@ BOOST_AUTO_TEST_CASE(state_smoke_test)
|
|||||||
BOOST_CHECK(callContractFunction(0, bytes(1, 0x00)) == toBigEndian(u256(0x3)));
|
BOOST_CHECK(callContractFunction(0, bytes(1, 0x00)) == toBigEndian(u256(0x3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(compound_assign)
|
||||||
|
{
|
||||||
|
char const* sourceCode = "contract test {\n"
|
||||||
|
" uint value1;\n"
|
||||||
|
" uint value2;\n"
|
||||||
|
" function f(uint x, uint y) returns (uint w) {\n"
|
||||||
|
" uint value3 = y;"
|
||||||
|
" value1 += x;\n"
|
||||||
|
" value3 *= x;"
|
||||||
|
" value2 *= value3 + value1;\n"
|
||||||
|
" return value2 += 7;"
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
|
||||||
|
u256 value1;
|
||||||
|
u256 value2;
|
||||||
|
auto f = [&](u256 const& _x, u256 const& _y) -> u256
|
||||||
|
{
|
||||||
|
u256 value3 = _y;
|
||||||
|
value1 += _x;
|
||||||
|
value3 *= _x;
|
||||||
|
value2 *= value3 + value1;
|
||||||
|
return value2 += 7;
|
||||||
|
};
|
||||||
|
testSolidityAgainstCpp(0, f, u256(0), u256(6));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(1), u256(3));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(2), u256(25));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(3), u256(69));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(4), u256(84));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(5), u256(2));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(6), u256(51));
|
||||||
|
testSolidityAgainstCpp(0, f, u256(7), u256(48));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(simple_mapping)
|
BOOST_AUTO_TEST_CASE(simple_mapping)
|
||||||
{
|
{
|
||||||
char const* sourceCode = "contract test {\n"
|
char const* sourceCode = "contract test {\n"
|
||||||
|
@ -311,6 +311,16 @@ BOOST_AUTO_TEST_CASE(forward_function_reference)
|
|||||||
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(comparison_bitop_precedence)
|
||||||
|
{
|
||||||
|
char const* text = "contract First {\n"
|
||||||
|
" function fun() returns (bool ret) {\n"
|
||||||
|
" return 1 & 2 == 8 & 9 && 1 ^ 2 < 4 | 6;\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -394,6 +394,35 @@ BOOST_AUTO_TEST_CASE(dev_multiline_return)
|
|||||||
checkNatspec(sourceCode, natspec, false);
|
checkNatspec(sourceCode, natspec, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(dev_multiline_comment)
|
||||||
|
{
|
||||||
|
char const* sourceCode = "contract test {\n"
|
||||||
|
" /**\n"
|
||||||
|
" * @dev Multiplies a number by 7 and adds second parameter\n"
|
||||||
|
" * @param a Documentation for the first parameter starts here.\n"
|
||||||
|
" * Since it's a really complicated parameter we need 2 lines\n"
|
||||||
|
" * @param second Documentation for the second parameter\n"
|
||||||
|
" * @return The result of the multiplication\n"
|
||||||
|
" * and cookies with nutella\n"
|
||||||
|
" */"
|
||||||
|
" function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
char const* natspec = "{"
|
||||||
|
"\"methods\":{"
|
||||||
|
" \"mul\":{ \n"
|
||||||
|
" \"details\": \"Multiplies a number by 7 and adds second parameter\",\n"
|
||||||
|
" \"params\": {\n"
|
||||||
|
" \"a\": \"Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines\",\n"
|
||||||
|
" \"second\": \"Documentation for the second parameter\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"return\": \"The result of the multiplication and cookies with nutella\"\n"
|
||||||
|
" }\n"
|
||||||
|
"}}";
|
||||||
|
|
||||||
|
checkNatspec(sourceCode, natspec, false);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(dev_contract_no_doc)
|
BOOST_AUTO_TEST_CASE(dev_contract_no_doc)
|
||||||
{
|
{
|
||||||
char const* sourceCode = "contract test {\n"
|
char const* sourceCode = "contract test {\n"
|
||||||
|
@ -128,7 +128,7 @@ BOOST_AUTO_TEST_CASE(function_natspec_documentation)
|
|||||||
BOOST_REQUIRE_NO_THROW(contract = parseText(text));
|
BOOST_REQUIRE_NO_THROW(contract = parseText(text));
|
||||||
auto functions = contract->getDefinedFunctions();
|
auto functions = contract->getDefinedFunctions();
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(), " This is a test function");
|
BOOST_CHECK_EQUAL(*function->getDocumentation(), "This is a test function");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(function_normal_comments)
|
BOOST_AUTO_TEST_CASE(function_normal_comments)
|
||||||
@ -166,17 +166,17 @@ BOOST_AUTO_TEST_CASE(multiple_functions_natspec_documentation)
|
|||||||
auto functions = contract->getDefinedFunctions();
|
auto functions = contract->getDefinedFunctions();
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(), " This is test function 1");
|
BOOST_CHECK_EQUAL(*function->getDocumentation(), "This is test function 1");
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(1));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(1));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(), " This is test function 2");
|
BOOST_CHECK_EQUAL(*function->getDocumentation(), "This is test function 2");
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(2));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(2));
|
||||||
BOOST_CHECK_MESSAGE(function->getDocumentation() == nullptr,
|
BOOST_CHECK_MESSAGE(function->getDocumentation() == nullptr,
|
||||||
"Should not have gotten natspec comment for functionName3()");
|
"Should not have gotten natspec comment for functionName3()");
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(3));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(3));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(), " This is test function 4");
|
BOOST_CHECK_EQUAL(*function->getDocumentation(), "This is test function 4");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(multiline_function_documentation)
|
BOOST_AUTO_TEST_CASE(multiline_function_documentation)
|
||||||
@ -194,7 +194,7 @@ BOOST_AUTO_TEST_CASE(multiline_function_documentation)
|
|||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(),
|
BOOST_CHECK_EQUAL(*function->getDocumentation(),
|
||||||
" This is a test function\n"
|
"This is a test function\n"
|
||||||
" and it has 2 lines");
|
" and it has 2 lines");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,11 +220,11 @@ BOOST_AUTO_TEST_CASE(natspec_comment_in_function_body)
|
|||||||
auto functions = contract->getDefinedFunctions();
|
auto functions = contract->getDefinedFunctions();
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(0));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(), " fun1 description");
|
BOOST_CHECK_EQUAL(*function->getDocumentation(), "fun1 description");
|
||||||
|
|
||||||
BOOST_REQUIRE_NO_THROW(function = functions.at(1));
|
BOOST_REQUIRE_NO_THROW(function = functions.at(1));
|
||||||
BOOST_CHECK_EQUAL(*function->getDocumentation(),
|
BOOST_CHECK_EQUAL(*function->getDocumentation(),
|
||||||
" This is a test function\n"
|
"This is a test function\n"
|
||||||
" and it has 2 lines");
|
" and it has 2 lines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +157,14 @@ BOOST_AUTO_TEST_CASE(documentation_comments_parsed_begin)
|
|||||||
{
|
{
|
||||||
Scanner scanner(CharStream("/// Send $(value / 1000) chocolates to the user"));
|
Scanner scanner(CharStream("/// Send $(value / 1000) chocolates to the user"));
|
||||||
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS);
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS);
|
||||||
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), " Send $(value / 1000) chocolates to the user");
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(multiline_documentation_comments_parsed_begin)
|
||||||
|
{
|
||||||
|
Scanner scanner(CharStream("/** Send $(value / 1000) chocolates to the user*/"));
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(documentation_comments_parsed)
|
BOOST_AUTO_TEST_CASE(documentation_comments_parsed)
|
||||||
@ -167,7 +174,43 @@ BOOST_AUTO_TEST_CASE(documentation_comments_parsed)
|
|||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||||
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), " Send $(value / 1000) chocolates to the user");
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(multiline_documentation_comments_parsed)
|
||||||
|
{
|
||||||
|
Scanner scanner(CharStream("some other tokens /**\n"
|
||||||
|
"* Send $(value / 1000) chocolates to the user\n"
|
||||||
|
"*/"));
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(multiline_documentation_no_stars)
|
||||||
|
{
|
||||||
|
Scanner scanner(CharStream("some other tokens /**\n"
|
||||||
|
" Send $(value / 1000) chocolates to the user\n"
|
||||||
|
"*/"));
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(multiline_documentation_whitespace_hell)
|
||||||
|
{
|
||||||
|
Scanner scanner(CharStream("some other tokens /** \t \r \n"
|
||||||
|
"\t \r * Send $(value / 1000) chocolates to the user\n"
|
||||||
|
"*/"));
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "Send $(value / 1000) chocolates to the user");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(comment_before_eos)
|
BOOST_AUTO_TEST_CASE(comment_before_eos)
|
||||||
@ -184,6 +227,13 @@ BOOST_AUTO_TEST_CASE(documentation_comment_before_eos)
|
|||||||
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "");
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(empty_multiline_documentation_comment_before_eos)
|
||||||
|
{
|
||||||
|
Scanner scanner(CharStream("/***/"));
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS);
|
||||||
|
BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(comments_mixed_in_sequence)
|
BOOST_AUTO_TEST_CASE(comments_mixed_in_sequence)
|
||||||
{
|
{
|
||||||
Scanner scanner(CharStream("hello_world ///documentation comment \n"
|
Scanner scanner(CharStream("hello_world ///documentation comment \n"
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <libethereum/Client.h>
|
#include <libethereum/Client.h>
|
||||||
#include <liblll/Compiler.h>
|
#include <liblll/Compiler.h>
|
||||||
|
#include <libevm/VMFactory.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace dev::eth;
|
using namespace dev::eth;
|
||||||
@ -330,7 +331,7 @@ void checkStorage(map<u256, u256> _expectedStore, map<u256, u256> _resultStore,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(_resultStore.size(), _expectedStore.size());
|
BOOST_CHECK_EQUAL(_resultStore.size(), _expectedStore.size());
|
||||||
for (auto&& resultStorePair : _resultStore)
|
for (auto&& resultStorePair: _resultStore)
|
||||||
{
|
{
|
||||||
if (!_expectedStore.count(resultStorePair.first))
|
if (!_expectedStore.count(resultStorePair.first))
|
||||||
BOOST_ERROR(_expectedAddr << ": unexpected store key " << resultStorePair.first);
|
BOOST_ERROR(_expectedAddr << ": unexpected store key " << resultStorePair.first);
|
||||||
@ -472,4 +473,20 @@ void executeTests(const string& _name, const string& _testPathAppendix, std::fun
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void processCommandLineOptions()
|
||||||
|
{
|
||||||
|
auto argc = boost::unit_test::framework::master_test_suite().argc;
|
||||||
|
auto argv = boost::unit_test::framework::master_test_suite().argv;
|
||||||
|
|
||||||
|
for (auto i = 0; i < argc; ++i)
|
||||||
|
{
|
||||||
|
if (std::string(argv[i]) == "--jit")
|
||||||
|
{
|
||||||
|
eth::VMFactory::setKind(eth::VMKind::JIT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} } // namespaces
|
} } // namespaces
|
||||||
|
@ -76,6 +76,7 @@ void checkLog(eth::LogEntries _resultLogs, eth::LogEntries _expectedLogs);
|
|||||||
void executeTests(const std::string& _name, const std::string& _testPathAppendix, std::function<void(json_spirit::mValue&, bool)> doTests);
|
void executeTests(const std::string& _name, const std::string& _testPathAppendix, std::function<void(json_spirit::mValue&, bool)> doTests);
|
||||||
std::string getTestPath();
|
std::string getTestPath();
|
||||||
void userDefinedTest(std::string testTypeFlag, std::function<void(json_spirit::mValue&, bool)> doTests);
|
void userDefinedTest(std::string testTypeFlag, std::function<void(json_spirit::mValue&, bool)> doTests);
|
||||||
|
void processCommandLineOptions();
|
||||||
|
|
||||||
template<typename mapType>
|
template<typename mapType>
|
||||||
void checkAddresses(mapType& _expectedAddrs, mapType& _resultAddrs)
|
void checkAddresses(mapType& _expectedAddrs, mapType& _resultAddrs)
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
This file is part of cpp-ethereum.
|
This file is part of cpp-ethereum.
|
||||||
|
|
||||||
cpp-ethereum is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
cpp-ethereum is distributed in the hope that it will be useful,
|
cpp-ethereum is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/** @file createRandomTest.cpp
|
/** @file createRandomTest.cpp
|
||||||
* @author Christoph Jentzsch <jentzsch.simulationsoftware@gmail.com>
|
* @author Christoph Jentzsch <jentzsch.simulationsoftware@gmail.com>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
* @date 2014
|
* @date 2014
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if ETH_JSONRPC && 0
|
#if ETH_JSONRPC
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
@ -29,7 +29,7 @@
|
|||||||
#include <libwebthree/WebThree.h>
|
#include <libwebthree/WebThree.h>
|
||||||
#include <libweb3jsonrpc/WebThreeStubServer.h>
|
#include <libweb3jsonrpc/WebThreeStubServer.h>
|
||||||
#include <libweb3jsonrpc/CorsHttpServer.h>
|
#include <libweb3jsonrpc/CorsHttpServer.h>
|
||||||
#include <json/json.h>
|
//#include <json/json.h>
|
||||||
#include <jsonrpccpp/server/connectors/httpserver.h>
|
#include <jsonrpccpp/server/connectors/httpserver.h>
|
||||||
#include <jsonrpccpp/client/connectors/httpclient.h>
|
#include <jsonrpccpp/client/connectors/httpclient.h>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
@ -141,5 +141,168 @@
|
|||||||
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||||
"data" : ""
|
"data" : ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"refund50_1" : {
|
||||||
|
"env" : {
|
||||||
|
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
|
||||||
|
"currentNumber" : "0",
|
||||||
|
"currentGasLimit" : "1000000",
|
||||||
|
"currentDifficulty" : "256",
|
||||||
|
"currentTimestamp" : 1,
|
||||||
|
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "1000000000000000000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "{ [[ 1 ]] 0 [[ 2 ]] 0 [[ 3 ]] 0 [[ 4 ]] 0 [[ 5 ]] 0 }",
|
||||||
|
"storage" : {
|
||||||
|
"0x01" : "0x01",
|
||||||
|
"0x02" : "0x01",
|
||||||
|
"0x03" : "0x01",
|
||||||
|
"0x04" : "0x01",
|
||||||
|
"0x05" : "0x01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "10000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "",
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transaction" : {
|
||||||
|
"nonce" : "0",
|
||||||
|
"gasPrice" : "1",
|
||||||
|
"gasLimit" : "10000",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"value" : "0",
|
||||||
|
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||||
|
"data" : ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"refund50_2" : {
|
||||||
|
"env" : {
|
||||||
|
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
|
||||||
|
"currentNumber" : "0",
|
||||||
|
"currentGasLimit" : "1000000",
|
||||||
|
"currentDifficulty" : "256",
|
||||||
|
"currentTimestamp" : 1,
|
||||||
|
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "1000000000000000000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "{ [[ 10 ]] 1 [[ 11 ]] 1 [[ 1 ]] 0 [[ 2 ]] 0 [[ 3 ]] 0 [[ 4 ]] 0 [[ 5 ]] 0 }",
|
||||||
|
"storage" : {
|
||||||
|
"0x01" : "0x01",
|
||||||
|
"0x02" : "0x01",
|
||||||
|
"0x03" : "0x01",
|
||||||
|
"0x04" : "0x01",
|
||||||
|
"0x05" : "0x01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "10000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "",
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transaction" : {
|
||||||
|
"nonce" : "0",
|
||||||
|
"gasPrice" : "1",
|
||||||
|
"gasLimit" : "10000",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"value" : "0",
|
||||||
|
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||||
|
"data" : ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"refund500" : {
|
||||||
|
"env" : {
|
||||||
|
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
|
||||||
|
"currentNumber" : "0",
|
||||||
|
"currentGasLimit" : "1000000",
|
||||||
|
"currentDifficulty" : "256",
|
||||||
|
"currentTimestamp" : 1,
|
||||||
|
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "1000000000000000000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "{ @@1 @@2 [[ 10 ]] (EXP 2 0xff) [[ 11 ]] (BALANCE (ADDRESS)) [[ 1 ]] 0 [[ 2 ]] 0 [[ 3 ]] 0 [[ 4 ]] 0 [[ 5 ]] 0 [[ 6 ]] 0 }",
|
||||||
|
"storage" : {
|
||||||
|
"0x01" : "0x01",
|
||||||
|
"0x02" : "0x01",
|
||||||
|
"0x03" : "0x01",
|
||||||
|
"0x04" : "0x01",
|
||||||
|
"0x05" : "0x01",
|
||||||
|
"0x06" : "0x01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "10000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "",
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transaction" : {
|
||||||
|
"nonce" : "0",
|
||||||
|
"gasPrice" : "1",
|
||||||
|
"gasLimit" : "10000",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"value" : "0",
|
||||||
|
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||||
|
"data" : ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"refund600" : {
|
||||||
|
"env" : {
|
||||||
|
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
|
||||||
|
"currentNumber" : "0",
|
||||||
|
"currentGasLimit" : "1000000",
|
||||||
|
"currentDifficulty" : "256",
|
||||||
|
"currentTimestamp" : 1,
|
||||||
|
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "1000000000000000000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "{ @@1 @@2 [[ 10 ]] (EXP 2 0xffff) [[ 11 ]] (BALANCE (ADDRESS)) [[ 1 ]] 0 [[ 2 ]] 0 [[ 3 ]] 0 [[ 4 ]] 0 [[ 5 ]] 0 [[ 6 ]] 0 }",
|
||||||
|
"storage" : {
|
||||||
|
"0x01" : "0x01",
|
||||||
|
"0x02" : "0x01",
|
||||||
|
"0x03" : "0x01",
|
||||||
|
"0x04" : "0x01",
|
||||||
|
"0x05" : "0x01",
|
||||||
|
"0x06" : "0x01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "10000",
|
||||||
|
"nonce" : 0,
|
||||||
|
"code" : "",
|
||||||
|
"storage": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transaction" : {
|
||||||
|
"nonce" : "0",
|
||||||
|
"gasPrice" : "1",
|
||||||
|
"gasLimit" : "10000",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"value" : "0",
|
||||||
|
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
||||||
|
"data" : ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,8 @@ namespace dev { namespace test {
|
|||||||
|
|
||||||
void doStateTests(json_spirit::mValue& v, bool _fillin)
|
void doStateTests(json_spirit::mValue& v, bool _fillin)
|
||||||
{
|
{
|
||||||
|
processCommandLineOptions();
|
||||||
|
|
||||||
for (auto& i: v.get_obj())
|
for (auto& i: v.get_obj())
|
||||||
{
|
{
|
||||||
cerr << i.first << endl;
|
cerr << i.first << endl;
|
||||||
|
24
vm.cpp
24
vm.cpp
@ -20,6 +20,7 @@
|
|||||||
* vm test functions.
|
* vm test functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <libethereum/Executive.h>
|
#include <libethereum/Executive.h>
|
||||||
#include <libevm/VMFactory.h>
|
#include <libevm/VMFactory.h>
|
||||||
@ -308,6 +309,8 @@ namespace dev { namespace test {
|
|||||||
|
|
||||||
void doVMTests(json_spirit::mValue& v, bool _fillin)
|
void doVMTests(json_spirit::mValue& v, bool _fillin)
|
||||||
{
|
{
|
||||||
|
processCommandLineOptions();
|
||||||
|
|
||||||
for (auto& i: v.get_obj())
|
for (auto& i: v.get_obj())
|
||||||
{
|
{
|
||||||
cnote << i.first;
|
cnote << i.first;
|
||||||
@ -317,7 +320,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
|||||||
BOOST_REQUIRE(o.count("pre") > 0);
|
BOOST_REQUIRE(o.count("pre") > 0);
|
||||||
BOOST_REQUIRE(o.count("exec") > 0);
|
BOOST_REQUIRE(o.count("exec") > 0);
|
||||||
|
|
||||||
dev::test::FakeExtVM fev;
|
FakeExtVM fev;
|
||||||
fev.importEnv(o["env"].get_obj());
|
fev.importEnv(o["env"].get_obj());
|
||||||
fev.importState(o["pre"].get_obj());
|
fev.importState(o["pre"].get_obj());
|
||||||
|
|
||||||
@ -332,12 +335,12 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bytes output;
|
bytes output;
|
||||||
auto vm = eth::VMFactory::create(fev.gas);
|
|
||||||
|
|
||||||
u256 gas;
|
u256 gas;
|
||||||
bool vmExceptionOccured = false;
|
bool vmExceptionOccured = false;
|
||||||
|
auto startTime = std::chrono::high_resolution_clock::now();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
auto vm = eth::VMFactory::create(fev.gas);
|
||||||
output = vm->go(fev, fev.simpleTrace()).toBytes();
|
output = vm->go(fev, fev.simpleTrace()).toBytes();
|
||||||
gas = vm->gas();
|
gas = vm->gas();
|
||||||
}
|
}
|
||||||
@ -357,6 +360,21 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
|||||||
BOOST_ERROR("Failed VM Test with Exception: " << _e.what());
|
BOOST_ERROR("Failed VM Test with Exception: " << _e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto endTime = std::chrono::high_resolution_clock::now();
|
||||||
|
auto argc = boost::unit_test::framework::master_test_suite().argc;
|
||||||
|
auto argv = boost::unit_test::framework::master_test_suite().argv;
|
||||||
|
for (auto i = 0; i < argc; ++i)
|
||||||
|
{
|
||||||
|
if (std::string(argv[i]) == "--show-times")
|
||||||
|
{
|
||||||
|
auto testDuration = endTime - startTime;
|
||||||
|
cnote << "Execution time: "
|
||||||
|
<< std::chrono::duration_cast<std::chrono::milliseconds>(testDuration).count()
|
||||||
|
<< " ms";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// delete null entries in storage for the sake of comparison
|
// delete null entries in storage for the sake of comparison
|
||||||
|
|
||||||
for (auto &a: fev.addresses)
|
for (auto &a: fev.addresses)
|
||||||
|
Loading…
Reference in New Issue
Block a user