mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2990 from ethereum/someMoreSMTStuff
Basic SMT tests.
This commit is contained in:
commit
f6fb7d96d3
@ -49,13 +49,6 @@ env:
|
||||
|
||||
matrix:
|
||||
include:
|
||||
# Ubuntu 14.04 LTS "Trusty Tahr"
|
||||
# https://en.wikipedia.org/wiki/List_of_Ubuntu_releases#Ubuntu_14.04_LTS_.28Trusty_Tahr.29
|
||||
#
|
||||
# TravisCI doesn't directly support any new Ubuntu releases. These is
|
||||
# some Docker support, which we should probably investigate, at least for
|
||||
# Ubuntu 16.04 LTS "Xenial Xerus"
|
||||
# See https://en.wikipedia.org/wiki/List_of_Ubuntu_releases#Ubuntu_16.04_LTS_.28Xenial_Xerus.29.
|
||||
- os: linux
|
||||
dist: trusty
|
||||
sudo: required
|
||||
|
@ -71,7 +71,7 @@ build_script:
|
||||
test_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
- cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION%
|
||||
- soltest.exe --show-progress -- --no-ipc
|
||||
- soltest.exe --show-progress -- --no-ipc --no-smt
|
||||
|
||||
artifacts:
|
||||
- path: solidity-windows.zip
|
||||
|
@ -64,9 +64,11 @@ Running the compiler tests
|
||||
==========================
|
||||
|
||||
Solidity includes different types of tests. They are included in the application
|
||||
called ``soltest``. Some of them require the ``cpp-ethereum`` client in testing mode.
|
||||
called ``soltest``. Some of them require the ``cpp-ethereum`` client in testing mode,
|
||||
some others require ``libz3`` to be installed.
|
||||
|
||||
To run a subset of the tests that do not require ``cpp-ethereum``, use ``./build/test/soltest -- --no-ipc``.
|
||||
To disable the z3 tests, use ``./build/test/soltest -- --no-smt`` and
|
||||
to run a subset of the tests that do not require ``cpp-ethereum``, use ``./build/test/soltest -- --no-ipc``.
|
||||
|
||||
For all other tests, you need to install `cpp-ethereum <https://github.com/ethereum/cpp-ethereum/releases/download/solidityTester/eth>`_ and run it in testing mode: ``eth --test -d /tmp/testeth``.
|
||||
|
||||
|
@ -72,28 +72,21 @@ void Z3Interface::addAssertion(Expression const& _expr)
|
||||
|
||||
pair<CheckResult, vector<string>> Z3Interface::check(vector<Expression> const& _expressionsToEvaluate)
|
||||
{
|
||||
// cout << "---------------------------------" << endl;
|
||||
// cout << m_solver << endl;
|
||||
CheckResult result;
|
||||
switch (m_solver.check())
|
||||
{
|
||||
case z3::check_result::sat:
|
||||
result = CheckResult::SATISFIABLE;
|
||||
cout << "sat" << endl;
|
||||
break;
|
||||
case z3::check_result::unsat:
|
||||
result = CheckResult::UNSATISFIABLE;
|
||||
cout << "unsat" << endl;
|
||||
break;
|
||||
case z3::check_result::unknown:
|
||||
result = CheckResult::UNKNOWN;
|
||||
cout << "unknown" << endl;
|
||||
break;
|
||||
default:
|
||||
solAssert(false, "");
|
||||
}
|
||||
// cout << "---------------------------------" << endl;
|
||||
|
||||
|
||||
vector<string> values;
|
||||
if (result != CheckResult::UNSATISFIABLE)
|
||||
|
@ -256,15 +256,6 @@ case $(uname -s) in
|
||||
#------------------------------------------------------------------------------
|
||||
# Ubuntu
|
||||
#
|
||||
# TODO - I wonder whether all of the Ubuntu-variants need some special
|
||||
# treatment?
|
||||
#
|
||||
# TODO - We should also test this code on Ubuntu Server, Ubuntu Snappy Core
|
||||
# and Ubuntu Phone.
|
||||
#
|
||||
# TODO - Our Ubuntu build is only working for amd64 and i386 processors.
|
||||
# It would be good to add armel, armhf and arm64.
|
||||
# See https://github.com/ethereum/webthree-umbrella/issues/228.
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
Ubuntu)
|
||||
@ -320,6 +311,14 @@ case $(uname -s) in
|
||||
libboost-all-dev \
|
||||
"$install_z3"
|
||||
if [ "$CI" = true ]; then
|
||||
# install Z3 from PPA if the distribution does not provide it
|
||||
if ! dpkg -l libz3-dev > /dev/null 2>&1
|
||||
then
|
||||
sudo apt-add-repository -y ppa:hvr/z3
|
||||
sudo apt-get -y update
|
||||
sudo apt-get -y install libz3-dev
|
||||
fi
|
||||
|
||||
# Install 'eth', for use in the Solidity Tests-over-IPC.
|
||||
# We will not use this 'eth', but its dependencies
|
||||
sudo add-apt-repository -y ppa:ethereum/ethereum
|
||||
|
@ -45,6 +45,8 @@ Options::Options()
|
||||
showMessages = true;
|
||||
else if (string(suite.argv[i]) == "--no-ipc")
|
||||
disableIPC = true;
|
||||
else if (string(suite.argv[i]) == "--no-smt")
|
||||
disableSMT = true;
|
||||
|
||||
if (!disableIPC && ipcPath.empty())
|
||||
if (auto path = getenv("ETH_TEST_IPC"))
|
||||
|
@ -35,6 +35,7 @@ struct Options: boost::noncopyable
|
||||
bool showMessages = false;
|
||||
bool optimize = false;
|
||||
bool disableIPC = false;
|
||||
bool disableSMT = false;
|
||||
|
||||
static Options const& get();
|
||||
|
||||
|
@ -39,6 +39,17 @@
|
||||
|
||||
using namespace boost::unit_test;
|
||||
|
||||
namespace
|
||||
{
|
||||
void removeTestSuite(std::string const& _name)
|
||||
{
|
||||
master_test_suite_t& master = framework::master_test_suite();
|
||||
auto id = master.get(_name);
|
||||
assert(id != INV_TEST_UNIT_ID);
|
||||
master.remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
|
||||
{
|
||||
master_test_suite_t& master = framework::master_test_suite();
|
||||
@ -57,12 +68,10 @@ test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
|
||||
"SolidityEndToEndTest",
|
||||
"SolidityOptimizer"
|
||||
})
|
||||
{
|
||||
auto id = master.get(suite);
|
||||
assert(id != INV_TEST_UNIT_ID);
|
||||
master.remove(id);
|
||||
}
|
||||
removeTestSuite(suite);
|
||||
}
|
||||
if (dev::test::Options::get().disableSMT)
|
||||
removeTestSuite("SMTChecker");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
86
test/libsolidity/SMTChecker.cpp
Normal file
86
test/libsolidity/SMTChecker.cpp
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
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/>.
|
||||
*/
|
||||
/**
|
||||
* Unit tests for the SMT checker.
|
||||
*/
|
||||
|
||||
#include <test/libsolidity/AnalysisFramework.h>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace dev
|
||||
{
|
||||
namespace solidity
|
||||
{
|
||||
namespace test
|
||||
{
|
||||
|
||||
class SMTCheckerFramework: public AnalysisFramework
|
||||
{
|
||||
public:
|
||||
SMTCheckerFramework()
|
||||
{
|
||||
m_warningsToFilter.push_back("Experimental features are turned on.");
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual std::pair<SourceUnit const*, std::shared_ptr<Error const>>
|
||||
parseAnalyseAndReturnError(
|
||||
std::string const& _source,
|
||||
bool _reportWarnings = false,
|
||||
bool _insertVersionPragma = true,
|
||||
bool _allowMultipleErrors = false
|
||||
)
|
||||
{
|
||||
return AnalysisFramework::parseAnalyseAndReturnError(
|
||||
"pragma experimental SMTChecker;\n" + _source,
|
||||
_reportWarnings,
|
||||
_insertVersionPragma,
|
||||
_allowMultipleErrors
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(SMTChecker, SMTCheckerFramework)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(smoke_test)
|
||||
{
|
||||
string text = R"(
|
||||
contract C { }
|
||||
)";
|
||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(simple_overflow)
|
||||
{
|
||||
string text = R"(
|
||||
contract C {
|
||||
function f(uint a, uint b) public pure returns (uint) { return a + b; }
|
||||
}
|
||||
)";
|
||||
CHECK_WARNING(text, "Overflow (resulting value larger than");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user