You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by is...@apache.org on 2022/09/09 20:00:46 UTC
[ignite-3] 05/17: IGNITE-17424 Start Ignite node
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 e07dda19358470963d9c41ce9625a0a83f652c44
Author: Igor Sapego <is...@apache.org>
AuthorDate: Mon Aug 29 14:28:49 2022 +0400
IGNITE-17424 Start Ignite node
---
modules/platforms/cpp/CMakeLists.txt | 6 ++--
.../cpp/client-test/src/ignite_client_test.cpp | 27 +++++++++++++++-
.../cpp/test-common/include/ignite_node.h | 34 +++++++++++++-------
.../platforms/cpp/test-common/include/test_utils.h | 26 +++++++++++++++
.../platforms/cpp/test-common/src/ignite_node.cpp | 31 ++++++++++++++++--
.../platforms/cpp/test-common/src/test_utils.cpp | 37 +++++++++++++++++++---
6 files changed, 139 insertions(+), 22 deletions(-)
diff --git a/modules/platforms/cpp/CMakeLists.txt b/modules/platforms/cpp/CMakeLists.txt
index 54fc4ed113..ca11746ca4 100644
--- a/modules/platforms/cpp/CMakeLists.txt
+++ b/modules/platforms/cpp/CMakeLists.txt
@@ -23,8 +23,10 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_PROJECT_VERSION ${PROJECT_VERSION})
-include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
-conan_basic_setup()
+if(EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
+ include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
+ conan_basic_setup()
+endif()
if (UNIX)
include(GNUInstallDirs)
diff --git a/modules/platforms/cpp/client-test/src/ignite_client_test.cpp b/modules/platforms/cpp/client-test/src/ignite_client_test.cpp
index 416ca4af6b..2413b1839b 100644
--- a/modules/platforms/cpp/client-test/src/ignite_client_test.cpp
+++ b/modules/platforms/cpp/client-test/src/ignite_client_test.cpp
@@ -15,8 +15,13 @@
* limitations under the License.
*/
+#include <thread>
+#include <chrono>
+
#include <gtest/gtest.h>
+#include "ignite_node.h"
+
class ClientTest : public ::testing::Test {
protected:
ClientTest() = default;
@@ -37,5 +42,25 @@ protected:
TEST_F(ClientTest, TestTest)
{
- EXPECT_EQ(1, 1);
+ std::cout << "Hello" << std::endl;
+
+ ignite::IgniteNode node;
+
+ node.start();
+
+ for (int i = 0; i < 20; ++i)
+ {
+ std::cout << node.getOutput();
+
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ }
+
+ node.stop();
+
+ for (int i = 0; i < 2; ++i)
+ {
+ std::cout << node.getOutput();
+
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ }
}
\ No newline at end of file
diff --git a/modules/platforms/cpp/test-common/include/ignite_node.h b/modules/platforms/cpp/test-common/include/ignite_node.h
index ad0a889336..224aa3e124 100644
--- a/modules/platforms/cpp/test-common/include/ignite_node.h
+++ b/modules/platforms/cpp/test-common/include/ignite_node.h
@@ -15,24 +15,25 @@
* limitations under the License.
*/
-#pragma once
+#ifndef TEST_COMMON_IGNITE_NODE
+#define TEST_COMMON_IGNITE_NODE
-#include <cstdio>
+//#include <cstdio>
namespace ignite
{
class IgniteNode
{
public:
- /**
- * Constructor.
- */
- IgniteNode() = default;
+// /**
+// * Constructor.
+// */
+// IgniteNode() = default;
- /**
- * Destructor.
- */
- ~IgniteNode() = default;
+// /**
+// * Destructor.
+// */
+// ~IgniteNode() = default;
/**
* Start node.
@@ -44,7 +45,16 @@ namespace ignite
*/
void stop();
+ /**
+ * Get current node output.
+ *
+ * @param max Max bytes to get.
+ * @return Output.
+ */
+ std::string getOutput(int max = 1024);
private:
- FILE* file;
+ FILE* stream;
};
-} // namespace ignite
\ No newline at end of file
+} // namespace ignite
+
+#endif // TEST_COMMON_IGNITE_NODE
diff --git a/modules/platforms/cpp/test-common/include/test_utils.h b/modules/platforms/cpp/test-common/include/test_utils.h
index 8905bdbc65..ca0d00a51f 100644
--- a/modules/platforms/cpp/test-common/include/test_utils.h
+++ b/modules/platforms/cpp/test-common/include/test_utils.h
@@ -17,6 +17,8 @@
#pragma once
+#include <cstdio>
+
#include <string>
namespace ignite
@@ -33,4 +35,28 @@ namespace ignite
* @return Resolved Ignite home.
*/
std::string resolveIgniteHome(const std::string& path = "");
+
+ /**
+ * Get path to maven executable.
+ */
+ std::string getMavenPath();
+
+ /**
+ * Open process.
+ *
+ * @param command System shell command line instruction.
+ * @param type Mode of the returned process output stream. Can be one of the following:
+ * "r" - The calling process can read the spawned command's standard output using the returned stream.
+ * "w" - The calling process can write to the spawned command's standard input using the returned stream.
+ * @return File stream for the process.
+ */
+ FILE* processOpen(const char *command, const char *type);
+
+ /**
+ * Waits for the associated process to terminate and returns the exit status of the command.
+ *
+ * @param stream Return value from the previous call to processOpen().
+ * @return Returns the exit status of the terminating command processor, or -1 if an error occurs.
+ */
+ int processClose(FILE* stream);
} // namespace ignite
\ No newline at end of file
diff --git a/modules/platforms/cpp/test-common/src/ignite_node.cpp b/modules/platforms/cpp/test-common/src/ignite_node.cpp
index 2c2863c122..1fb4bfb6eb 100644
--- a/modules/platforms/cpp/test-common/src/ignite_node.cpp
+++ b/modules/platforms/cpp/test-common/src/ignite_node.cpp
@@ -16,22 +16,47 @@
*/
#include <iostream>
-#include <memory>
#include <stdexcept>
-#include <string>
-#include <array>
+#include <vector>
+#include <utility>
#include "ignite_node.h"
+#include "test_utils.h"
namespace ignite
{
void IgniteNode::start()
{
+ std::string home = resolveIgniteHome();
+ if (home.empty())
+ throw std::runtime_error(
+ "Can not resolve Ignite home directory. Try setting IGNITE_HOME explicitly");
+ std::string command =
+#ifdef WIN32
+ "cmd.exe /c ";
+#else
+ "/bin/bash -c ";
+#endif
+
+ command += getMavenPath() + " " + "exec:java@platform-test-node-runner";
+
+ stream = processOpen(command.c_str(), "r");
}
void IgniteNode::stop()
{
+ if (stream)
+ processClose(stream);
+ }
+
+ std::string IgniteNode::getOutput(int max)
+ {
+ std::string buffer(max, 0);
+
+ size_t actual = std::fread(buffer.data(), 1, max, stream);
+ buffer.resize(actual);
+ return buffer;
}
} // namespace ignite
\ No newline at end of file
diff --git a/modules/platforms/cpp/test-common/src/test_utils.cpp b/modules/platforms/cpp/test-common/src/test_utils.cpp
index 3ca15df6d5..65fe5b8975 100644
--- a/modules/platforms/cpp/test-common/src/test_utils.cpp
+++ b/modules/platforms/cpp/test-common/src/test_utils.cpp
@@ -15,14 +15,15 @@
* limitations under the License.
*/
+#include <iostream>
#include <filesystem>
#include <functional>
+#include <vector>
#include "test_utils.h"
namespace ignite
{
-
/**
* Checks if the path looks like binary release home directory.
* Internally checks for presence of core library.
@@ -66,9 +67,13 @@ namespace ignite
if (!error && std::filesystem::is_directory(path))
return home.string();
- home = std::filesystem::canonical(std::getenv("IGNITE_HOME"), error);
- if (!error && std::filesystem::is_directory(home))
- return home.string();
+ const char *env = std::getenv("IGNITE_HOME");
+ if (env)
+ {
+ home = std::filesystem::canonical(env, error);
+ if (!error && std::filesystem::is_directory(home))
+ return home.string();
+ }
home = std::filesystem::current_path();
while (!home.empty() && home.has_relative_path())
@@ -80,4 +85,28 @@ namespace ignite
}
return home.string();
}
+
+ std::string getMavenPath()
+ {
+ // Currently, we only support systems with "mvn" command in PATH
+ return "mvn";
+ }
+
+ FILE *processOpen(const char *command, const char *type)
+ {
+#ifdef WIN32
+ return _popen(command, type);
+#else
+ return popen(command, type);
+#endif
+ }
+
+ int processClose(FILE *stream)
+ {
+#ifdef WIN32
+ return _pclose(stream);
+#else
+ return pclose(stream);
+#endif
+ }
} // namespace ignite
\ No newline at end of file