From b6202b6013179e8dd0792819a3127c437e74d1fa Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Tue, 22 Jun 2021 12:04:01 +0200 Subject: [PATCH] abstract CaosDBConnection and CaosDBConnectionConfig --- include/connection.h | 26 +++++++++++++++++++++----- src/caosdbcli.cpp | 19 ++++++++++++------- src/connection.cpp | 30 ++++++++++++++++++++---------- test/CMakeLists.txt | 4 ++-- test/test_connection.cpp | 9 ++++++--- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/include/connection.h b/include/connection.h index a6046c8..5317099 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 fd591a2..0b5e3f3 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 580a6ad..d52e15d 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 0c2f934..0eae700 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 ba64060..5ddfc94 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); } -- GitLab