From 1bc0320811ef2b213bda0629b702bffae5e2f925 Mon Sep 17 00:00:00 2001 From: chriseth Date: Sat, 6 Aug 2016 11:37:52 +0200 Subject: Cleanup of test suite init. --- test/TestHelper.cpp | 34 ++++++------- test/TestHelper.h | 22 ++++----- test/boostTest.cpp | 66 ++++--------------------- test/libsolidity/SolidityExecutionFramework.cpp | 3 -- 4 files changed, 33 insertions(+), 92 deletions(-) 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..beb081cd 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; + + 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 - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - #pragma GCC diagnostic pop - - #include - #include - #include "TestHelper.h" - - using namespace boost::unit_test; - - std::vector 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 - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - #pragma GCC diagnostic pop - - #include - 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 +#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 @@ -38,9 +38,6 @@ namespace // anonymous 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 or the environment variable ETH_TEST_IPC)"); -- cgit v1.2.3 From 53f68a155f071194fd779352d5997c03a6c387ed Mon Sep 17 00:00:00 2001 From: chriseth Date: Sat, 6 Aug 2016 11:55:37 +0200 Subject: Exponential sleep increase on mining failure. --- test/RPCSession.cpp | 8 ++++++-- test/TestHelper.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp index 8ed9e9ac..43ad26e1 100644 --- a/test/RPCSession.cpp +++ b/test/RPCSession.cpp @@ -245,11 +245,15 @@ void RPCSession::test_mineBlocks(int _number) 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) + unsigned sleepTime = 10; + for (size_t polls = 0; polls < 10; ++polls) { if (fromBigEndian(fromHex(rpcCall("eth_blockNumber").asString())) >= startBlock + _number) return; - std::this_thread::sleep_for(chrono::milliseconds(10)); //it does not work faster then 10 ms + std::this_thread::sleep_for(chrono::milliseconds(sleepTime)); + if (sleepTime > 500) + cout << "Mining timeout, sleeping for " << sleepTime << " ms" << endl; + sleepTime *= 2; } BOOST_FAIL("Error in test_mineBlocks: block mining timeout!"); diff --git a/test/TestHelper.h b/test/TestHelper.h index beb081cd..2cb24fd7 100644 --- a/test/TestHelper.h +++ b/test/TestHelper.h @@ -107,7 +107,7 @@ struct Options: boost::noncopyable { std::string ipcPath; - Options const& get(); + static Options const& get(); private: Options(); -- cgit v1.2.3 From b9f5b675a664ebdb1b28b87271783c59341ef3f1 Mon Sep 17 00:00:00 2001 From: chriseth Date: Sat, 6 Aug 2016 13:18:00 +0200 Subject: Auto-calibrate mining sleep time. --- test/RPCSession.cpp | 37 ++++++++++++++++++++++++++++--------- test/RPCSession.h | 2 ++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp index 43ad26e1..de10b381 100644 --- a/test/RPCSession.cpp +++ b/test/RPCSession.cpp @@ -244,19 +244,38 @@ void RPCSession::test_mineBlocks(int _number) u256 startBlock = fromBigEndian(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 - unsigned sleepTime = 10; - for (size_t polls = 0; polls < 10; ++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) { - if (fromBigEndian(fromHex(rpcCall("eth_blockNumber").asString())) >= startBlock + _number) - return; std::this_thread::sleep_for(chrono::milliseconds(sleepTime)); - if (sleepTime > 500) - cout << "Mining timeout, sleeping for " << sleepTime << " ms" << endl; - sleepTime *= 2; + if (fromBigEndian(fromHex(rpcCall("eth_blockNumber").asString())) >= startBlock + _number) + 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 m_accounts; }; -- cgit v1.2.3 From 61e94940bc6dd916408a73b0510a81ac2c75c932 Mon Sep 17 00:00:00 2001 From: chriseth Date: Sat, 6 Aug 2016 13:27:29 +0200 Subject: Show compilation errors in tests. --- test/libsolidity/SolidityExecutionFramework.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 #include +#include 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()); -- cgit v1.2.3 From d4799399494e0a25c0dbac1a4262fe7b2d65b46f Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 12 Aug 2016 15:12:54 +0200 Subject: Move custom test options to after -- --- appveyor.yml | 2 +- scripts/tests.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 428a7a68..a5a8d67c 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 -- cgit v1.2.3