Provide path to libevmone.

This commit is contained in:
chriseth 2019-07-16 19:05:13 +02:00
parent 13e2a6fe52
commit f692cec11d
6 changed files with 44 additions and 58 deletions

View File

@ -57,15 +57,12 @@ boost::filesystem::path testPath()
return {};
}
std::string IPCEnvOrDefaultPath()
string EVMOneEnvOrDefaultPath()
{
if (auto path = getenv("ETH_TEST_IPC"))
if (auto path = getenv("ETH_EVMONE"))
return path;
if (auto home = getenv("HOME"))
return std::string(home) + "/.ethereum/geth.ipc";
return std::string{};
else
return "./libevmone.so";
}
CommonOptions::CommonOptions(std::string _caption):
@ -77,8 +74,7 @@ CommonOptions::CommonOptions(std::string _caption):
options.add_options()
("evm-version", po::value(&evmVersionString), "which evm version to use")
("testpath", po::value<fs::path>(&this->testPath)->default_value(dev::test::testPath()), "path to test files")
("ipcpath", po::value<fs::path>(&ipcPath)->default_value(IPCEnvOrDefaultPath()), "path to ipc socket")
("no-ipc", po::bool_switch(&disableIPC), "disable semantic tests")
("evmonepath", po::value<fs::path>(&evmonePath)->default_value(EVMOneEnvOrDefaultPath()), "path to libevmone.so")
("no-smt", po::bool_switch(&disableSMT), "disable SMT checker");
}
@ -95,19 +91,6 @@ void CommonOptions::validate() const
"Invalid test path specified."
);
// if (!disableIPC)
// {
// assertThrow(
// !ipcPath.empty(),
// ConfigException,
// "No ipc path specified. The --ipcpath argument must not be empty when given."
// );
// assertThrow(
// fs::exists(ipcPath),
// ConfigException,
// "Invalid ipc path specified."
// );
// }
}
bool CommonOptions::parse(int argc, char const* const* argv)

View File

@ -34,11 +34,10 @@ struct ConfigException : public Exception {};
struct CommonOptions: boost::noncopyable
{
boost::filesystem::path ipcPath;
boost::filesystem::path evmonePath;
boost::filesystem::path testPath;
bool optimize = false;
bool optimizeYul = false;
bool disableIPC = false;
bool disableSMT = false;
langutil::EVMVersion evmVersion() const;

View File

@ -35,41 +35,18 @@ using namespace std;
using namespace dev;
using namespace dev::test;
namespace
{
evmc::vm& getVM()
evmc::vm* EVMHost::getVM(string const& _path)
{
static unique_ptr<evmc::vm> theVM;
if (!theVM)
if (!theVM && !_path.empty())
{
// TODO make this an option
for (auto path: {
"deps/lib/libevmone.so",
"../deps/lib/libevmone.so",
"/usr/lib/libevmone.so",
"/usr/local/lib/libevmone.so",
// TODO the circleci docker image somehow only has the .a file
"/usr/lib/libevmone.a"
})
{
evmc_loader_error_code errorCode = {};
evmc_instance* vm = evmc_load_and_create(path, &errorCode);
if (!vm || errorCode != EVMC_LOADER_SUCCESS)
continue;
evmc_loader_error_code errorCode = {};
evmc_instance* vm = evmc_load_and_create(_path.c_str(), &errorCode);
if (vm && errorCode == EVMC_LOADER_SUCCESS)
theVM = make_unique<evmc::vm>(vm);
break;
}
if (!theVM)
{
cerr << "Unable to find library libevmone.so" << endl;
assertThrow(false, Exception, "");
}
}
return *theVM;
}
return theVM.get();
}
EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::vm* _vm):

View File

@ -38,6 +38,11 @@ using Address = h160;
class EVMHost: public evmc::Host
{
public:
/// Tries to dynamically load libevmone. @returns nullptr on failure.
/// The path has to be provided for the first successful run and will be ignored
/// afterwards.
static evmc::vm* getVM(std::string const& _path = {});
explicit EVMHost(langutil::EVMVersion _evmVersion, evmc::vm* _vm = getVM());
struct Account

View File

@ -37,6 +37,7 @@
#include <test/InteractiveTests.h>
#include <test/Options.h>
#include <test/EVMHost.h>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/predicate.hpp>
@ -140,6 +141,14 @@ test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
master.p_name.value = "SolidityTests";
dev::test::Options::get().validate();
bool disableIPC = !dev::test::EVMHost::getVM();
if (disableIPC)
{
cout << "Unable to find libevmone.so. Please provide the path using -- --evmonepath <path>." << endl;
cout << "You can download it at" << endl;
cout << "https://github.com/ethereum/evmone/releases/download/v0.1.0/evmone-0.1.0-linux-x86_64.tar.gz" << endl;
cout << endl << "--- SKIPPING ALL SEMANTICS TESTS ---" << endl << endl;
}
// Include the interactive tests in the automatic tests as well
for (auto const& ts: g_interactiveTestsuites)
{
@ -148,19 +157,19 @@ test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
if (ts.smt && options.disableSMT)
continue;
if (ts.ipc && options.disableIPC)
if (ts.ipc && disableIPC)
continue;
solAssert(registerTests(
master,
options.testPath / ts.path,
ts.subpath,
options.ipcPath.string(),
options.evmonePath.string(),
ts.testCaseCreator
) > 0, std::string("no ") + ts.title + " tests found");
}
if (dev::test::Options::get().disableIPC)
if (disableIPC)
{
for (auto suite: {
"ABIDecoderTest",

View File

@ -22,6 +22,7 @@
#include <test/tools/IsolTestOptions.h>
#include <test/libsolidity/AnalysisFramework.h>
#include <test/InteractiveTests.h>
#include <test/EVMHost.h>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp>
@ -156,7 +157,7 @@ TestTool::Result TestTool::process()
{
(AnsiColorized(cout, formatted, {BOLD}) << m_name << ": ").flush();
m_test = m_testCaseCreator(TestCase::Config{m_path.string(), m_options.ipcPath.string(), m_options.evmVersion()});
m_test = m_testCaseCreator(TestCase::Config{m_path.string(), m_options.evmonePath.string(), m_options.evmVersion()});
if (m_test->validateSettings(m_options.evmVersion()))
switch (TestCase::TestResult result = m_test->run(outputMessages, " ", formatted))
{
@ -413,6 +414,15 @@ int main(int argc, char const *argv[])
return 1;
}
bool disableSemantics = !dev::test::EVMHost::getVM();
if (disableSemantics)
{
cout << "Unable to find libevmone.so. Please provide the path using --evmonepath <path>." << endl;
cout << "You can download it at" << endl;
cout << "https://github.com/ethereum/evmone/releases/download/v0.1.0/evmone-0.1.0-linux-x86_64.tar.gz" << endl;
cout << endl << "--- SKIPPING ALL SEMANTICS TESTS ---" << endl << endl;
}
TestStats global_stats{0, 0};
cout << "Running tests..." << endl << endl;
@ -420,7 +430,7 @@ int main(int argc, char const *argv[])
// Interactive tests are added in InteractiveTests.h
for (auto const& ts: g_interactiveTestsuites)
{
if (ts.ipc && options.disableIPC)
if (ts.ipc && disableSemantics)
continue;
if (ts.smt && options.disableSMT)
@ -451,5 +461,8 @@ int main(int argc, char const *argv[])
}
cout << "." << endl;
if (disableSemantics)
cout << "\nNOTE: Skipped semantics tests because libevmone.so could not be found.\n" << endl;
return global_stats ? 0 : 1;
}