mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Provide path to libevmone.
This commit is contained in:
		
							parent
							
								
									13e2a6fe52
								
							
						
					
					
						commit
						f692cec11d
					
				| @ -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) | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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): | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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", | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user