diff options
author | chriseth <chris@ethereum.org> | 2016-08-12 22:53:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-12 22:53:02 +0800 |
commit | 230c531705ff656dac9fca3f4c72f30363c09ca6 (patch) | |
tree | 5a894f2c2a7c8b3d1621024dce6c523621e72622 | |
parent | c5203344a007c25d50cdf66ee23cb5fbdf74dae0 (diff) | |
parent | d4799399494e0a25c0dbac1a4262fe7b2d65b46f (diff) | |
download | dexon-solidity-230c531705ff656dac9fca3f4c72f30363c09ca6.tar.gz dexon-solidity-230c531705ff656dac9fca3f4c72f30363c09ca6.tar.zst dexon-solidity-230c531705ff656dac9fca3f4c72f30363c09ca6.zip |
Merge pull request #837 from chriseth/testsuitecleanup
Cleanup of test runner.
-rw-r--r-- | appveyor.yml | 2 | ||||
-rwxr-xr-x | scripts/tests.sh | 2 | ||||
-rw-r--r-- | test/RPCSession.cpp | 33 | ||||
-rw-r--r-- | test/RPCSession.h | 2 | ||||
-rw-r--r-- | test/TestHelper.cpp | 34 | ||||
-rw-r--r-- | test/TestHelper.h | 22 | ||||
-rw-r--r-- | test/boostTest.cpp | 66 | ||||
-rw-r--r-- | test/libsolidity/SolidityExecutionFramework.cpp | 3 | ||||
-rw-r--r-- | test/libsolidity/SolidityExecutionFramework.h | 13 |
9 files changed, 77 insertions, 100 deletions
diff --git a/appveyor.yml b/appveyor.yml index 82751373..e990cff8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -51,7 +51,7 @@ build_script: # - cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION% # - copy "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x86\Microsoft.VC140.CRT\msvc*.dll" . # - start eth.exe --test -d %TMP%\eth_for_soltest -# - soltest.exe --ipc %TMP%\eth_for_soltest\geth.ipc +# - soltest.exe -- --ipc %TMP%\eth_for_soltest\geth.ipc # - pkill eth artifacts: diff --git a/scripts/tests.sh b/scripts/tests.sh index 5c482d3d..f3bcf65f 100755 --- a/scripts/tests.sh +++ b/scripts/tests.sh @@ -53,7 +53,7 @@ $ETH_PATH --test -d /tmp/test & while [ ! -S /tmp/test/geth.ipc ]; do sleep 2; done # And then run the Solidity unit-tests, pointing to that IPC endpoint. -"$REPO_ROOT"/build/test/soltest --ipc /tmp/test/geth.ipc +"$REPO_ROOT"/build/test/soltest -- --ipc /tmp/test/geth.ipc ERROR_CODE=$? pkill eth || true sleep 4 diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp index 8ed9e9ac..de10b381 100644 --- a/test/RPCSession.cpp +++ b/test/RPCSession.cpp @@ -244,15 +244,38 @@ void RPCSession::test_mineBlocks(int _number) u256 startBlock = fromBigEndian<u256>(fromHex(rpcCall("eth_blockNumber").asString())); rpcCall("test_mineBlocks", { to_string(_number) }, true); - //@TODO do not use polling - but that would probably need a change to the test client - for (size_t polls = 0; polls < 100; ++polls) + bool mined = false; + + // We auto-calibrate the time it takes to mine the transaction. + // It would be better to go without polling, but that would probably need a change to the test client + + unsigned sleepTime = m_sleepTime; + size_t polls = 0; + for (; polls < 10 && !mined; ++polls) { + std::this_thread::sleep_for(chrono::milliseconds(sleepTime)); if (fromBigEndian<u256>(fromHex(rpcCall("eth_blockNumber").asString())) >= startBlock + _number) - return; - std::this_thread::sleep_for(chrono::milliseconds(10)); //it does not work faster then 10 ms + mined = true; + else + sleepTime *= 2; + } + if (polls > 1) + { + m_successfulMineRuns = 0; + m_sleepTime += 2; + } + else if (polls == 1) + { + m_successfulMineRuns++; + if (m_successfulMineRuns > 5) + { + m_successfulMineRuns = 0; + m_sleepTime--; + } } - BOOST_FAIL("Error in test_mineBlocks: block mining timeout!"); + if (!mined) + BOOST_FAIL("Error in test_mineBlocks: block mining timeout!"); } void RPCSession::test_modifyTimestamp(size_t _timestamp) diff --git a/test/RPCSession.h b/test/RPCSession.h index 9b7009bf..2a9825b0 100644 --- a/test/RPCSession.h +++ b/test/RPCSession.h @@ -124,6 +124,8 @@ private: IPCSocket m_ipcSocket; size_t m_rpcSequence = 1; + unsigned m_sleepTime = 10; + unsigned m_successfulMineRuns = 0; std::vector<std::string> m_accounts; }; diff --git a/test/TestHelper.cpp b/test/TestHelper.cpp index a704ab17..bfc5b54c 100644 --- a/test/TestHelper.cpp +++ b/test/TestHelper.cpp @@ -24,28 +24,22 @@ using namespace std; using namespace dev::test; -Options::Options(int argc, char** argv) +Options const& Options::get() { - tArgc = 0; - tArgv = new char*[argc]; - for (auto i = 0; i < argc; i++) - { - string arg = argv[i]; - if (arg == "--ipc" && i + 1 < argc) + static Options instance; + return instance; +} + +Options::Options() +{ + auto const& suite = boost::unit_test::framework::master_test_suite(); + for (auto i = 0; i < suite.argc; i++) + if (string(suite.argv[i]) == "--ipc" && i + 1 < suite.argc) { - ipcPath = argv[i + 1]; + ipcPath = suite.argv[i + 1]; i++; } - else - { - tArgv[i] = argv[i]; - tArgc++; - } - } + if (ipcPath.empty()) + if (auto path = getenv("ETH_TEST_IPC")) + ipcPath = path; } - -Options const& Options::get(int argc, char** argv) -{ - static Options instance(argc, argv); - return instance; -}
\ No newline at end of file diff --git a/test/TestHelper.h b/test/TestHelper.h index 49931614..2cb24fd7 100644 --- a/test/TestHelper.h +++ b/test/TestHelper.h @@ -103,19 +103,15 @@ namespace test while (0) - class Options - { - public: - std::string ipcPath; - int tArgc; - char **tArgv; - /// Get reference to options - /// The first time used, options are parsed with argc, argv - static Options const& get(int argc = 0, char** argv = 0); +struct Options: boost::noncopyable +{ + std::string ipcPath; + + static Options const& get(); + +private: + Options(); +}; - private: - Options(int argc, char** argv = 0); - Options(Options const&) = delete; - }; } } diff --git a/test/boostTest.cpp b/test/boostTest.cpp index 7ed2a6cd..4ddae0b7 100644 --- a/test/boostTest.cpp +++ b/test/boostTest.cpp @@ -26,59 +26,13 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" - #define BOOST_TEST_NO_MAIN - #if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable:4535) // calling _set_se_translator requires /EHa - #endif - #include <boost/test/included/unit_test.hpp> - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - #pragma GCC diagnostic pop - - #include <stdlib.h> - #include <boost/version.hpp> - #include "TestHelper.h" - - using namespace boost::unit_test; - - std::vector<char*> parameters; - static std::ostringstream strCout; - std::streambuf* oldCoutStreamBuf; - std::streambuf* oldCerrStreamBuf; - - //Custom Boost Initialization - test_suite* fake_init_func(int argc, char* argv[]) - { - //Required for boost. -nowarning - (void)argc; - (void)argv; - return 0; - } - - //Custom Boost Unit Test Main - int main(int argc, char* argv[]) - { - //Initialize options before boost reads it - dev::test::Options const& opt = dev::test::Options::get(argc, argv); - return unit_test_main(fake_init_func, opt.tArgc, opt.tArgv); - } - - /* -#else - #if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable:4535) // calling _set_se_translator requires /EHa - #endif - #include <boost/test/included/unit_test.hpp> - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - #pragma GCC diagnostic pop - - #include <test/TestHelper.h> - using namespace boost::unit_test; -#endif*/
\ No newline at end of file +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4535) // calling _set_se_translator requires /EHa +#endif +#include <boost/test/included/unit_test.hpp> +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#pragma GCC diagnostic pop diff --git a/test/libsolidity/SolidityExecutionFramework.cpp b/test/libsolidity/SolidityExecutionFramework.cpp index 921fd056..d0ee13c6 100644 --- a/test/libsolidity/SolidityExecutionFramework.cpp +++ b/test/libsolidity/SolidityExecutionFramework.cpp @@ -39,9 +39,6 @@ string getIPCSocketPath() { string ipcPath = dev::test::Options::get().ipcPath; if (ipcPath.empty()) - if (auto path = getenv("ETH_TEST_IPC")) - ipcPath = path; - if (ipcPath.empty()) BOOST_FAIL("ERROR: ipcPath not set! (use --ipc <path> or the environment variable ETH_TEST_IPC)"); return ipcPath; diff --git a/test/libsolidity/SolidityExecutionFramework.h b/test/libsolidity/SolidityExecutionFramework.h index 5764784a..c34b00ec 100644 --- a/test/libsolidity/SolidityExecutionFramework.h +++ b/test/libsolidity/SolidityExecutionFramework.h @@ -33,6 +33,7 @@ #include <libsolidity/interface/CompilerStack.h> #include <libsolidity/interface/Exceptions.h> +#include <libsolidity/interface/SourceReferenceFormatter.h> namespace dev { @@ -68,7 +69,17 @@ public: { m_compiler.reset(false, m_addStandardSources); m_compiler.addSource("", _sourceCode); - ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed"); + if (!m_compiler.compile(m_optimize, m_optimizeRuns)) + { + for (auto const& error: m_compiler.errors()) + SourceReferenceFormatter::printExceptionInformation( + std::cerr, + *error, + (error->type() == Error::Type::Warning) ? "Warning" : "Error", + [&](std::string const& _sourceName) -> solidity::Scanner const& { return m_compiler.scanner(_sourceName); } + ); + BOOST_ERROR("Compiling contract failed"); + } eth::LinkerObject obj = m_compiler.object(_contractName); obj.link(_libraryAddresses); BOOST_REQUIRE(obj.linkReferences.empty()); |