Skip to content
Snippets Groups Projects
Verified Commit 926e76b8 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

Merge branch 'f-logging-segfaults' into f-debug-build

parents 0378ad0c 95f21fb1
No related branches found
No related tags found
2 merge requests!33Release 0.1,!30Debug build
Pipeline #14884 failed
...@@ -101,12 +101,12 @@ public: ...@@ -101,12 +101,12 @@ public:
}; };
/** /**
* @brief The connection isn't known to the ConnectionManager under this name. * @brief Exception for errors during the configuration of the connection.
*/ */
class UnknownConnectionError : public Exception { class ConnectionConfigurationError : public Exception {
public: public:
explicit UnknownConnectionError(const std::string &what_arg) explicit ConnectionConfigurationError(const std::string &what_arg)
: Exception(StatusCode::UNKNOWN_CONNECTION_ERROR, what_arg) {} : Exception(StatusCode::CONNECTION_CONFIGURATION_ERROR, what_arg) {}
}; };
} // namespace caosdb::exceptions } // namespace caosdb::exceptions
......
...@@ -39,24 +39,24 @@ const std::string logger_name = "caosdb::logging"; ...@@ -39,24 +39,24 @@ const std::string logger_name = "caosdb::logging";
typedef boost::log::sources::severity_channel_logger_mt<int, std::string> boost_logger_class; typedef boost::log::sources::severity_channel_logger_mt<int, std::string> boost_logger_class;
class _logger { class logger {
public: public:
static boost_logger_class &get() { return *_logger::GetInstance()._logger_instance; } static boost_logger_class &get() { return *logger::GetInstance()._logger_instance; }
static void destroy() { static void destroy() {
auto &instance = _logger::GetInstance(); auto &instance = logger::GetInstance();
delete instance._logger_instance; delete instance._logger_instance;
} }
private: private:
_logger() { this->_logger_instance = new boost_logger_class(); }; logger() { this->_logger_instance = new boost_logger_class(); };
static _logger &GetInstance() { static logger &GetInstance() {
static _logger instance; static logger instance;
return instance; return instance;
} }
boost_logger_class *_logger_instance; boost_logger_class *_logger_instance;
}; };
auto inline get_logger() -> boost_logger_class & { return _logger::get(); } auto inline get_logger() -> boost_logger_class & { return logger::get(); }
/** /**
* This class stores the integer log level. * This class stores the integer log level.
......
...@@ -62,7 +62,7 @@ enum StatusCode { ...@@ -62,7 +62,7 @@ enum StatusCode {
GENERIC_ERROR = 21, GENERIC_ERROR = 21,
GENERIC_TRANSACTION_ERROR = 22, GENERIC_TRANSACTION_ERROR = 22,
CONFIGURATION_ERROR = 23, CONFIGURATION_ERROR = 23,
UNKNOWN_CONNECTION_ERROR = 24, CONNECTION_CONFIGURATION_ERROR = 24,
TRANSACTION_STATUS_ERROR = 25, TRANSACTION_STATUS_ERROR = 25,
TRANSACTION_TYPE_ERROR = 26, TRANSACTION_TYPE_ERROR = 26,
UNSUPPORTED_FEATURE = 27, UNSUPPORTED_FEATURE = 27,
......
...@@ -113,8 +113,8 @@ auto ConnectionManager::mGetConnection(const std::string &name) const ...@@ -113,8 +113,8 @@ auto ConnectionManager::mGetConnection(const std::string &name) const
auto connection = ConfigurationManager::GetConnectionConfiguration(name); auto connection = ConfigurationManager::GetConnectionConfiguration(name);
connections[name] = std::make_shared<Connection>(*connection.release()); connections[name] = std::make_shared<Connection>(*connection.release());
} catch (const caosdb::exceptions::ConfigurationError &exc) { } catch (const caosdb::exceptions::ConfigurationError &exc) {
throw caosdb::exceptions::UnknownConnectionError("No connection named '" + name + throw caosdb::exceptions::ConnectionConfigurationError("Error with the connection named '" +
"' present."); name + "': " + exc.what());
} }
} }
return this->connections.at(name); return this->connections.at(name);
......
...@@ -45,13 +45,11 @@ ...@@ -45,13 +45,11 @@
#include <vector> #include <vector>
void __attribute__((constructor)) startup() { void __attribute__((constructor)) startup() {
std::cout << "LOADING CAOSDB 1" << std::endl; std::cout << "LOADING CAOSDB" << std::endl;
boost::log::core::get()->set_logging_enabled(false);
std::cout << "LOADING CAOSDB 2" << std::endl;
} }
void __attribute__((destructor)) shutdown() { void __attribute__((destructor)) shutdown() {
std::cout << "UNLOADING CAOSDB 1" << std::endl; std::cout << "UNLOADING CAOSDB" << std::endl;
caosdb::logging::_logger::destroy(); caosdb::logging::logger::destroy();
} }
namespace caosdb::logging { namespace caosdb::logging {
......
...@@ -131,8 +131,9 @@ auto get_status_description(int code) -> const std::string & { ...@@ -131,8 +131,9 @@ auto get_status_description(int code) -> const std::string & {
"The transaction terminated unsuccessfully with transaction errors."}, "The transaction terminated unsuccessfully with transaction errors."},
{StatusCode::CONFIGURATION_ERROR, {StatusCode::CONFIGURATION_ERROR,
"An error occurred during the configuration of the ConfigurationManager."}, "An error occurred during the configuration of the ConfigurationManager."},
{StatusCode::UNKNOWN_CONNECTION_ERROR, {StatusCode::CONNECTION_CONFIGURATION_ERROR,
"The ConnectionManager does not know any connection of this name."}, "Wither there is no connection of the given name or the given connection has a faulty "
"configuration"},
{StatusCode::TRANSACTION_STATUS_ERROR, {StatusCode::TRANSACTION_STATUS_ERROR,
"The Transaction is in a wrong state for the attempted action."}, "The Transaction is in a wrong state for the attempted action."},
{StatusCode::TRANSACTION_TYPE_ERROR, {StatusCode::TRANSACTION_TYPE_ERROR,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "caosdb/certificate_provider.h" // for PemCertificateProvider #include "caosdb/certificate_provider.h" // for PemCertificateProvider
#include "caosdb/configuration.h" // for InsecureConnectionConfigura... #include "caosdb/configuration.h" // for InsecureConnectionConfigura...
#include "caosdb/connection.h" // for ConnectionManager #include "caosdb/connection.h" // for ConnectionManager
#include "caosdb/exceptions.h" // for UnknownConnectionError #include "caosdb/exceptions.h" // for ConnectionConfigurationError
#include "caosdb_test_utility.h" // for EXPECT_THROW_MESSAGE, TEST_... #include "caosdb_test_utility.h" // for EXPECT_THROW_MESSAGE, TEST_...
#include <gtest/gtest-message.h> // for Message #include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestPartR... #include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestPartR...
...@@ -65,9 +65,16 @@ TEST_F(test_connection, configure_ssl_localhost_8080) { ...@@ -65,9 +65,16 @@ TEST_F(test_connection, configure_ssl_localhost_8080) {
} }
TEST_F(test_connection, connection_manager_unknown_connection) { TEST_F(test_connection, connection_manager_unknown_connection) {
EXPECT_THROW_MESSAGE(ConnectionManager::GetConnection("test"), EXPECT_THROW_MESSAGE(
caosdb::exceptions::UnknownConnectionError, ConnectionManager::GetConnection("test"), caosdb::exceptions::ConnectionConfigurationError,
"No connection named 'test' present."); "Error with the connection named 'test': The connection 'test' has not been defined.");
}
TEST_F(test_connection, connection_missing_certificate) {
EXPECT_THROW_MESSAGE(ConnectionManager::GetConnection("missing"),
caosdb::exceptions::ConnectionConfigurationError,
std::string("Error with the connection named 'missing': ") +
"File does not exist (server_certificate_path): /missing");
} }
TEST_F(test_connection, connection_manager_get_default_connection) { TEST_F(test_connection, connection_manager_get_default_connection) {
......
...@@ -18,6 +18,16 @@ ...@@ -18,6 +18,16 @@
"username": "me", "username": "me",
"password": "secret!" "password": "secret!"
} }
},
"missing": {
"host": "localhost",
"port": 8443,
"server_certificate_path": "/missing",
"authentication": {
"type": "plain",
"username": "me",
"password": "secret!"
}
} }
}, },
"logging": { "logging": {
......
/*
*
* This file is a part of the CaosDB Project.
*
* Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
* Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl
#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST
#include <iostream> // for cout, <<
#include <string> // for string
#include <utility> // for move
namespace caosdb {
class TestClass {
public:
~TestClass() = default;
TestClass(TestClass &&other) = default;
TestClass(const TestClass &other);
TestClass();
explicit TestClass(std::string member);
auto operator=(const TestClass &other) -> TestClass &;
auto operator=(TestClass &&other) -> TestClass & = default;
[[nodiscard]] auto ToString() const -> std::string;
std::string member;
};
TestClass::TestClass() { std::cout << "Constructor TestClass(): " << ToString() << "\n"; }
TestClass::TestClass(std::string member) : member(std::move(member)) {
std::cout << "Constructor TestClass(const std:string &): " << ToString() << "\n";
}
TestClass::TestClass(const TestClass &other) : member(other.member) {
std::cout << "Copy Constructor TestClass(const TestClass &): " << ToString() << "\n";
}
auto TestClass::operator=(const TestClass &other) -> TestClass & {
std::cout << "Copy assignment (" << ToString() << "->";
if (this != &other) {
this->member = other.member;
}
std::cout << ToString() << ")\n";
return *this;
}
auto TestClass::ToString() const -> std::string { return "TestClass(" + member + ")"; }
TEST(test_misc, test_move) {
TestClass test_class1;
std::cout << "test_class1: " << test_class1.ToString() << "\n";
TestClass test_class2 = test_class1;
std::cout << "test_class2: " << test_class2.ToString() << "\n";
const TestClass test_class3("member3");
std::cout << "test_class3: " << test_class3.ToString() << "\n";
TestClass test_class4 = test_class3;
std::cout << "test_class4: " << test_class4.ToString() << "\n";
}
} // namespace caosdb
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment