diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2016-11-30 23:46:20 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-30 23:46:20 +0800 |
commit | ac357d12252ceb113a823a400418a59a94521c71 (patch) | |
tree | 1819b51023cc3ed4754fb8253da6ec407a406c0f /test/liblll | |
parent | 6ae6c70cde08f83667b55f09623f9584fbbd41b3 (diff) | |
parent | 53d4433484c33b32d4d1063330633a308c0e48dd (diff) | |
download | dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar.gz dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar.bz2 dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar.lz dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar.xz dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.tar.zst dexon-solidity-ac357d12252ceb113a823a400418a59a94521c71.zip |
Merge pull request #1442 from ethereum/lll-testing
LLL: introduce testing framework
Diffstat (limited to 'test/liblll')
-rw-r--r-- | test/liblll/EndToEndTest.cpp | 50 | ||||
-rw-r--r-- | test/liblll/ExecutionFramework.cpp | 33 | ||||
-rw-r--r-- | test/liblll/ExecutionFramework.h | 73 | ||||
-rw-r--r-- | test/liblll/Parser.cpp | 179 |
4 files changed, 335 insertions, 0 deletions
diff --git a/test/liblll/EndToEndTest.cpp b/test/liblll/EndToEndTest.cpp new file mode 100644 index 00000000..b5e32e94 --- /dev/null +++ b/test/liblll/EndToEndTest.cpp @@ -0,0 +1,50 @@ +/* + This file is part of solidity. + + solidity 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. + + solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @author Alex Beregszaszi + * @date 2016 + * End to end tests for LLL. + */ + +#include <string> +#include <memory> +#include <boost/test/unit_test.hpp> +#include <test/liblll/ExecutionFramework.h> + +using namespace std; + +namespace dev +{ +namespace lll +{ +namespace test +{ + +BOOST_FIXTURE_TEST_SUITE(LLLEndToEndTest, LLLExecutionFramework) + +BOOST_AUTO_TEST_CASE(smoke_test) +{ + char const* sourceCode = "(returnlll { (return \"test\") })"; + compileAndRun(sourceCode); + BOOST_CHECK(callFallback() == encodeArgs(string("test", 4))); +} + +BOOST_AUTO_TEST_SUITE_END() + +} +} +} // end namespaces diff --git a/test/liblll/ExecutionFramework.cpp b/test/liblll/ExecutionFramework.cpp new file mode 100644 index 00000000..4719c5f5 --- /dev/null +++ b/test/liblll/ExecutionFramework.cpp @@ -0,0 +1,33 @@ +/* + This file is part of solidity. + + solidity 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. + + solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @author Alex Beregszaszi + * @date 2016 + * Framework for executing LLL contracts and testing them via RPC. + */ + +#include <cstdlib> +#include <boost/test/framework.hpp> +#include <test/liblll/ExecutionFramework.h> + +using namespace dev::test; +using namespace dev::lll::test; + +LLLExecutionFramework::LLLExecutionFramework() : + ExecutionFramework() +{ +} diff --git a/test/liblll/ExecutionFramework.h b/test/liblll/ExecutionFramework.h new file mode 100644 index 00000000..58e1f0ad --- /dev/null +++ b/test/liblll/ExecutionFramework.h @@ -0,0 +1,73 @@ +/* + This file is part of solidity. + + solidity 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. + + solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @author Alex Beregszaszi + * @date 2016 + * Framework for executing LLL contracts and testing them via RPC. + */ + +#pragma once + +#include <functional> + +#include "../ExecutionFramework.h" + +#include <liblll/Compiler.h> + +using namespace dev::test; + +namespace dev +{ +namespace lll +{ + +namespace test +{ + +class LLLExecutionFramework: public ExecutionFramework +{ + +public: + LLLExecutionFramework(); + + virtual bytes const& compileAndRunWithoutCheck( + std::string const& _sourceCode, + u256 const& _value = 0, + std::string const& _contractName = "", + bytes const& _arguments = bytes(), + std::map<std::string, Address> const& _libraryAddresses = std::map<std::string, Address>() + ) override + { + BOOST_REQUIRE(_contractName.empty()); + BOOST_REQUIRE(_libraryAddresses.empty()); + + std::vector<std::string> errors; + bytes bytecode = eth::compileLLL(_sourceCode, m_optimize, &errors); + if (!errors.empty()) + { + for (auto const& error: errors) + std::cerr << error << std::endl; + BOOST_ERROR("Compiling contract failed"); + } + sendMessage(bytecode + _arguments, true, _value); + return m_output; + } +}; + +} +} +} // end namespaces diff --git a/test/liblll/Parser.cpp b/test/liblll/Parser.cpp new file mode 100644 index 00000000..fc91f3c5 --- /dev/null +++ b/test/liblll/Parser.cpp @@ -0,0 +1,179 @@ +/* + This file is part of solidity. + + solidity 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. + + solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @author Alex Beregszaszi + * @date 2016 + * Unit tests for the LLL parser. + */ + +#include <string> +#include <memory> +#include <boost/test/unit_test.hpp> +#include <liblll/Compiler.h> + +using namespace std; + +namespace dev +{ +namespace lll +{ +namespace test +{ + +namespace +{ + +bool successParse(std::string const& _source) +{ + std::string ret = eth::parseLLL(_source); + return ret.size() != 0; +} + +std::string parse(std::string const& _source) +{ + return eth::parseLLL(_source); +} + +} + +BOOST_AUTO_TEST_SUITE(LLLParser) + +BOOST_AUTO_TEST_CASE(smoke_test) +{ + char const* text = "1"; + BOOST_CHECK(successParse(text)); +} + +BOOST_AUTO_TEST_CASE(string) +{ + char const* text = "\"string\""; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"("string")"); +} + +BOOST_AUTO_TEST_CASE(symbol) +{ + char const* text = "symbol"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(symbol)"); + + BOOST_CHECK(successParse("'symbol")); + BOOST_CHECK_EQUAL(parse(text), R"(symbol)"); +} + +BOOST_AUTO_TEST_CASE(decimals) +{ + char const* text = "1234"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(1234)"); +} + +BOOST_AUTO_TEST_CASE(hexadecimals) +{ + char const* text = "0x1234"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(4660)"); +} + +BOOST_AUTO_TEST_CASE(sequence) +{ + char const* text = "{ 1234 }"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"({ 1234 })"); +} + +BOOST_AUTO_TEST_CASE(empty_sequence) +{ + char const* text = "{}"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"({ })"); +} + +BOOST_AUTO_TEST_CASE(mload) +{ + char const* text = "@0"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(@ 0)"); + + BOOST_CHECK(successParse("@0x0")); + BOOST_CHECK(successParse("@symbol")); + BOOST_CHECK(!successParse("@")); +} + +BOOST_AUTO_TEST_CASE(sload) +{ + char const* text = "@@0"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(@@ 0)"); + + BOOST_CHECK(successParse("@@0x0")); + BOOST_CHECK(successParse("@@symbol")); + BOOST_CHECK(!successParse("@@")); +} + +BOOST_AUTO_TEST_CASE(mstore) +{ + char const* text = "[0]:0"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"([ 0 ] 0)"); + + BOOST_CHECK(successParse("[0] 0")); + BOOST_CHECK(successParse("[0x0]:0x0")); + BOOST_CHECK(successParse("[symbol]:symbol")); + BOOST_CHECK(!successParse("[]")); + BOOST_CHECK(!successParse("[0]")); +} + +BOOST_AUTO_TEST_CASE(sstore) +{ + char const* text = "[[0]]:0"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"([[ 0 ]] 0)"); + + BOOST_CHECK(successParse("[[0]] 0")); + BOOST_CHECK(successParse("[[0x0]]:0x0")); + BOOST_CHECK(successParse("[[symbol]]:symbol")); + BOOST_CHECK(!successParse("[[]]")); + BOOST_CHECK(!successParse("[[0x0]]")); +} + +BOOST_AUTO_TEST_CASE(calldataload) +{ + char const* text = "$0"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"($ 0)"); + + BOOST_CHECK(successParse("$0x0")); + BOOST_CHECK(successParse("$symbol")); + BOOST_CHECK(!successParse("$")); +} + +BOOST_AUTO_TEST_CASE(list) +{ + char const* text = "( 1234 )"; + BOOST_CHECK(successParse(text)); + BOOST_CHECK_EQUAL(parse(text), R"(( 1234 ))"); + + BOOST_CHECK(successParse("( 1234 5467 )")); + BOOST_CHECK(successParse("()")); +} + +BOOST_AUTO_TEST_SUITE_END() + +} +} +} // end namespaces |