diff --git a/include/connection.h b/include/connection.h index a6046c8364e14e112a24990e8148d00287417b4a..5317099535f244f17cb45740dc3754ef9ca7ee86 100644 --- a/include/connection.h +++ b/include/connection.h @@ -39,6 +39,7 @@ namespace caosdb { using caosdb::info::v1alpha1::GeneralInfoService; using caosdb::info::v1alpha1::VersionInfo; +using grpc::ChannelCredentials; /** * @brief Configuration of the CaosDB connection. @@ -53,23 +54,38 @@ public: const CaosDBConnectionConfig &config) -> std::ostream &; - [[nodiscard]] auto getHost() -> std::string; - + [[nodiscard]] auto virtual toString() const -> std::string = 0; + [[nodiscard]] auto getHost() const -> std::string; [[nodiscard]] auto getPort() const -> int; + [[nodiscard]] auto virtual getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> = 0; +}; + +class InsecureCaosDBConnectionConfig: public CaosDBConnectionConfig { +private: + std::shared_ptr<ChannelCredentials> credentials; +public: + InsecureCaosDBConnectionConfig(const std::string &host, int port); + [[nodiscard]] auto toString() const -> std::string override; + [[nodiscard]] auto getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> override; +}; + +class SslCaosDBConnectionConfig: public CaosDBConnectionConfig { + SslCaosDBConnectionConfig(const std::string &host, int port); + SslCaosDBConnectionConfig(const std::string &host, int port, std::string cacert); }; /** * @brief A reusable connection to a CaosDBServer. */ class CaosDBConnection { - CaosDBConnectionConfig config; + std::shared_ptr<CaosDBConnectionConfig> config; std::unique_ptr<GeneralInfoService::Stub> stub_; public: - explicit CaosDBConnection(const CaosDBConnectionConfig &config); + explicit CaosDBConnection(const std::shared_ptr<CaosDBConnectionConfig> &config); friend auto operator<<(std::ostream &out, const CaosDBConnection &connection) -> std::ostream &; - auto getGeneralInfoService() -> GeneralInfoService::Stub &; + [[nodiscard]] auto getGeneralInfoService() const -> GeneralInfoService::Stub &; [[nodiscard]] auto getVersionInfo() const -> const VersionInfo &; }; } // namespace caosdb diff --git a/src/caosdbcli.cpp b/src/caosdbcli.cpp index fd591a2d1fe58841a24ebceb12d06466d214d831..0b5e3f345a2f113abdfd33bd437520c495b7a2ca 100644 --- a/src/caosdbcli.cpp +++ b/src/caosdbcli.cpp @@ -21,11 +21,11 @@ */ // A simple caosdb client -#include "connection.h" -#include "caosdb_config.h" -#include <memory> #include <iostream> #include <string> +#include "caosdb/info/v1alpha1/main.pb.h" +#include "caosdb_config.h" +#include "connection.h" auto main() -> int { @@ -34,15 +34,20 @@ auto main() -> int { << caosdb::LIBCAOSDB_VERSION_PATCH << ")" << std::endl; std::cout << "We don't miss the H of caos." << std::endl; - std::string host = "localhost"; + const std::string host = "localhost"; // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers) - int port = 8080; + const int port = 8080; + const std::string &test = host; + std::cout << test << std::endl; - caosdb::CaosDBConnectionConfig config(host, port); + std::shared_ptr<caosdb::InsecureCaosDBConnectionConfig> config = std::make_shared<caosdb::InsecureCaosDBConnectionConfig>(host, port); caosdb::CaosDBConnection connection(config); std::cout << std::endl << connection << std::endl; const caosdb::info::v1alpha1::VersionInfo &v_info = connection.getVersionInfo(); - std::cout << "VersionInfo(" << v_info.major() << ")" << std::endl; + const std::string &build = v_info.build(); + std::cout << "BUILD(" << build[0] << ")" << std::endl; + std::cout << "VersionInfo(" << v_info.major() << "." << v_info.minor() << "." << v_info.patch() << ")" << std::endl; + std::cout << "PRE_RELEASE(" << v_info.pre_release() << ")" << std::endl; return 0; } diff --git a/src/connection.cpp b/src/connection.cpp index 580a6ad6393accfcba945513dff28e4dc3d5b22a..d52e15dccc8b363c6ef115fdc84e5ec9ee2ed793 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -31,6 +31,7 @@ using caosdb::info::v1alpha1::GeneralInfoService; using caosdb::info::v1alpha1::GetVersionInfoRequest; using caosdb::info::v1alpha1::GetVersionInfoResponse; using caosdb::info::v1alpha1::VersionInfo; +using grpc::InsecureChannelCredentials; CaosDBConnectionConfig::CaosDBConnectionConfig(const std::string &host, int port) { @@ -38,33 +39,42 @@ CaosDBConnectionConfig::CaosDBConnectionConfig(const std::string &host, this->port = port; } -auto CaosDBConnectionConfig::getHost() -> std::string { return this->host; } +auto CaosDBConnectionConfig::getHost() const -> std::string { return this->host; } auto CaosDBConnectionConfig::getPort() const -> int { return this->port; } auto operator<<(std::ostream &out, const CaosDBConnectionConfig &config) -> std::ostream & { - out << "CaosDBConnectionConfig(\"" << config.host << "\"," << config.port - << ")"; + out << config.toString(); return out; } -CaosDBConnection::CaosDBConnection(const CaosDBConnectionConfig &config) - : config(config) { +InsecureCaosDBConnectionConfig::InsecureCaosDBConnectionConfig(const std::string &host, int port) : CaosDBConnectionConfig(host, port) { + this->credentials = grpc::InsecureChannelCredentials(); +} + +auto InsecureCaosDBConnectionConfig::toString() const -> std::string { + return "InsecureCaosDBConnectionConfig(" + this->getHost() + "," + std::to_string(this->getPort()) + ")"; +} + +auto InsecureCaosDBConnectionConfig::getChannelCredentials() const -> std::shared_ptr<ChannelCredentials> { + return this->credentials; +} + +CaosDBConnection::CaosDBConnection(const std::shared_ptr<CaosDBConnectionConfig> &config) { this->config = config; - std::shared_ptr<grpc::Channel> channel = grpc::CreateChannel( - this->config.getHost() + ":" + std::to_string(this->config.getPort()), - grpc::InsecureChannelCredentials()); + const std::string &target = this->config->getHost() + ":" + std::to_string(this->config->getPort()); + const std::shared_ptr<grpc::Channel> &channel = grpc::CreateChannel(target, this->config->getChannelCredentials()); this->stub_ = GeneralInfoService::NewStub(channel); } auto operator<<(std::ostream &out, const CaosDBConnection &connection) -> std::ostream & { - out << "CaosDBConnection(" << connection.config << ")"; + out << "CaosDBConnection(" << *(connection.config) << ")"; return out; } -auto CaosDBConnection::getGeneralInfoService() -> GeneralInfoService::Stub & { +auto CaosDBConnection::getGeneralInfoService() const -> GeneralInfoService::Stub & { return *stub_; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0c2f9349dcdb2bd04f955abb575d8b38ecde77d1..0eae700e02829e96d40851d5cf80f5bb6a5e09a2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -56,9 +56,9 @@ if (LCOV_PATH) setup_target_for_coverage_lcov( NAME unit_test_coverage EXECUTABLE ctest -L caosdb-cpplib-unit-tests - EXCLUDE "${CMAKE_BINARY_DIR}/*" "g++*" + EXCLUDE "${CMAKE_BINARY_DIR}/*" DEPEDENCIES caosdb ${test_cases} gtest_main - LCOV_ARGS --rc lcov_branch_coverage=1 + LCOV_ARGS --rc lcov_branch_coverage=1 --no-external GENHTML_ARGS --rc lcov_branch_coverage=1 ) else () diff --git a/test/test_connection.cpp b/test/test_connection.cpp index ba64060f9b564ffff7aa3beec57a3bb7047d87c4..5ddfc948cf48b52a842588ba47de08a722c31169 100644 --- a/test/test_connection.cpp +++ b/test/test_connection.cpp @@ -24,11 +24,14 @@ #include <gtest/gtest-message.h> #include <gtest/gtest-test-part.h> #include <memory> +#include <type_traits> #include "gtest/gtest_pred_impl.h" TEST(test_connection, localhost_8080) { - caosdb::CaosDBConnectionConfig config("localhost", 8000); + caosdb::InsecureCaosDBConnectionConfig config("localhost", 8000); - EXPECT_EQ("localhost", config.getHost()); - EXPECT_EQ(8000, config.getPort()); + ASSERT_EQ("localhost", config.getHost()); + ASSERT_EQ(8000, config.getPort()); + std::shared_ptr<grpc::ChannelCredentials> icc = config.getChannelCredentials(); + ASSERT_TRUE(icc != nullptr); }