This is an automated email from the ASF dual-hosted git repository. isapego pushed a commit to branch ignite-17424 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 713b1988cd38f62739f3d7a7722048f9ae0889bc Author: Igor Sapego <[email protected]> AuthorDate: Tue Aug 30 13:14:15 2022 +0400 IGNITE-17424 Dry-run prior to all tests --- modules/platforms/cpp/client-test/CMakeLists.txt | 3 +- .../ignite_node.h => client-test/src/main.cpp} | 57 +++++++++------------- .../cpp/test-common/include/ignite_node.h | 9 ++++ .../platforms/cpp/test-common/include/process.h | 12 ++++- .../platforms/cpp/test-common/src/ignite_node.cpp | 12 +++-- modules/platforms/cpp/test-common/src/process.cpp | 27 +++++++--- 6 files changed, 73 insertions(+), 47 deletions(-) diff --git a/modules/platforms/cpp/client-test/CMakeLists.txt b/modules/platforms/cpp/client-test/CMakeLists.txt index 40c4d0df40..34202f707e 100644 --- a/modules/platforms/cpp/client-test/CMakeLists.txt +++ b/modules/platforms/cpp/client-test/CMakeLists.txt @@ -27,11 +27,12 @@ include_directories(${GTEST_INCLUDE_DIR}) set(SOURCES src/ignite_client_test.cpp + src/main.cpp ) add_executable(${TARGET} ${SOURCES}) -target_link_libraries(${TARGET} ignite-test-common ${GTEST_LIBRARY} ${GTEST_MAIN_LIBRARY}) +target_link_libraries(${TARGET} ignite-test-common ${GTEST_LIBRARY}) set(TEST_TARGET IgniteClientTest) add_test(NAME ${TEST_TARGET} COMMAND ${TARGET}) diff --git a/modules/platforms/cpp/test-common/include/ignite_node.h b/modules/platforms/cpp/client-test/src/main.cpp similarity index 55% copy from modules/platforms/cpp/test-common/include/ignite_node.h copy to modules/platforms/cpp/client-test/src/main.cpp index c72ac06777..1f8eeae3d6 100644 --- a/modules/platforms/cpp/test-common/include/ignite_node.h +++ b/modules/platforms/cpp/client-test/src/main.cpp @@ -15,39 +15,30 @@ * limitations under the License. */ -#pragma once +#include <chrono> -#include "process.h" +#include <gtest/gtest.h> -namespace ignite +#include "ignite_node.h" + +void BeforeAll() { - class IgniteNode - { - public: - /** - * Constructor. - */ - IgniteNode() = default; - - /** - * Destructor. - */ - ~IgniteNode() = default; - - /** - * Start node. - * - * @param dryRun Perform a dry run. Mostly used to ensure that code is compiled and all artifacts are downloaded. - */ - void start(bool dryRun = false); - - /** - * Stop node. - */ - void stop(); - - private: - /** Underlying process. */ - std::unique_ptr<Process> process; - }; -} // namespace ignite + ignite::IgniteNode node; + + // Ignite dry run to make sure everything is built, all artifacts downloaded + // and Ignite node is ready to run. + node.start(true); + + // Five minutes should be enough but feel free to increase. + node.join(std::chrono::minutes(5)); + node.stop(); +} + + +int main(int argc, char** argv) +{ + BeforeAll(); + + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/modules/platforms/cpp/test-common/include/ignite_node.h b/modules/platforms/cpp/test-common/include/ignite_node.h index c72ac06777..10bc130b2c 100644 --- a/modules/platforms/cpp/test-common/include/ignite_node.h +++ b/modules/platforms/cpp/test-common/include/ignite_node.h @@ -17,6 +17,8 @@ #pragma once +#include <chrono> + #include "process.h" namespace ignite @@ -46,6 +48,13 @@ namespace ignite */ void stop(); + /** + * Join node process. + * + * @param timeout Timeout. + */ + void join(std::chrono::milliseconds timeout); + private: /** Underlying process. */ std::unique_ptr<Process> process; diff --git a/modules/platforms/cpp/test-common/include/process.h b/modules/platforms/cpp/test-common/include/process.h index b2d6d50121..ab45700ccb 100644 --- a/modules/platforms/cpp/test-common/include/process.h +++ b/modules/platforms/cpp/test-common/include/process.h @@ -17,6 +17,7 @@ #pragma once +#include <chrono> #include <string> namespace ignite @@ -44,9 +45,16 @@ namespace ignite virtual bool start() = 0; /** - * Stop process. + * Kill the process. */ - virtual void stop() = 0; + virtual void kill() = 0; + + /** + * Join process. + * + * @param timeout Timeout. + */ + virtual void join(std::chrono::milliseconds timeout) = 0; protected: /** diff --git a/modules/platforms/cpp/test-common/src/ignite_node.cpp b/modules/platforms/cpp/test-common/src/ignite_node.cpp index c4c7e8a9d1..560b9f54fd 100644 --- a/modules/platforms/cpp/test-common/src/ignite_node.cpp +++ b/modules/platforms/cpp/test-common/src/ignite_node.cpp @@ -52,15 +52,21 @@ namespace ignite process = Process::make(command, workDir.string()); if (!process->start()) { - throw std::runtime_error("Failed to invoke Ignite command: '" + command + "'"); - process.reset(); + + throw std::runtime_error("Failed to invoke Ignite command: '" + command + "'"); } } void IgniteNode::stop() { if (process) - process->stop(); + process->kill(); + } + + void IgniteNode::join(std::chrono::milliseconds timeout) + { + if (process) + process->join(timeout); } } // namespace ignite \ No newline at end of file diff --git a/modules/platforms/cpp/test-common/src/process.cpp b/modules/platforms/cpp/test-common/src/process.cpp index 4620b53aec..4911031bbc 100644 --- a/modules/platforms/cpp/test-common/src/process.cpp +++ b/modules/platforms/cpp/test-common/src/process.cpp @@ -18,7 +18,7 @@ #ifdef WIN32 # include <windows.h> # include <tlhelp32.h> -#endif // WIN32 +#endif #include <filesystem> #include <utility> @@ -34,7 +34,7 @@ namespace * @param processId ID of the parent process. * @return Process tree. */ - std::vector<DWORD> getProcessTree(DWORD processId) + std::vector<DWORD> getProcessTree(DWORD processId) // NOLINT(misc-no-recursion) { std::vector<DWORD> children; PROCESSENTRY32 pe; @@ -120,9 +120,9 @@ namespace } /** - * Stop process. + * Kill the process. */ - void stop() override + void kill() override { std::vector<DWORD> processTree = getProcessTree(info.dwProcessId); for (auto procId : processTree) @@ -137,12 +137,22 @@ namespace TerminateProcess(info.hProcess, 1); - WaitForSingleObject( info.hProcess, INFINITE ); - CloseHandle( info.hProcess ); CloseHandle( info.hThread ); } + /** + * Join process. + * + * @param timeout Timeout. + */ + void join(std::chrono::milliseconds timeout) override + { + auto msecs = timeout.count() < 0 ? INFINITE : static_cast<DWORD>(timeout.count()); + + WaitForSingleObject(info.hProcess, msecs); + } + private: /** Running flag. */ bool running; @@ -157,8 +167,9 @@ namespace PROCESS_INFORMATION info; }; -#else -#endif +#else // #ifdef WIN32 + +#endif // #ifdef WIN32 } namespace ignite
