diff --git a/include/cassandra.h b/include/cassandra.h index 13a0296ba..d6ea774f3 100644 --- a/include/cassandra.h +++ b/include/cassandra.h @@ -11298,6 +11298,15 @@ CASS_EXPORT void cass_log_set_callback(CassLogCallback callback, void* data); +/** + * Analogous getter - useful for restoring logger to previous values. + * + * @param[out] callback_out Current logging callback. Must point to a valid memory area. + * @param[out] data_out Current Logger instance. Must point to a valid memory area. + */ +CASS_EXPORT void +cass_log_get_callback_and_data(CassLogCallback* callback_out, void** data_out); + /** * Sets the log queue size. * diff --git a/src/logger.cpp b/src/logger.cpp index 0861eb21e..2ae776503 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -30,6 +30,10 @@ void cass_log_set_callback(CassLogCallback callback, void* data) { Logger::set_callback(callback, data); } +void cass_log_get_callback_and_data(CassLogCallback* callback_out, void** data_out) { + Logger::get_callback_and_data(callback_out, data_out); +} + void cass_log_set_queue_size(size_t queue_size) { // Deprecated } @@ -66,3 +70,8 @@ void Logger::set_callback(CassLogCallback cb, void* data) { cb_ = cb == NULL ? noop_log_callback : cb; data_ = data; } + +void Logger::get_callback_and_data(CassLogCallback* cb_out, void** data_out) { + *cb_out = cb_; + *data_out = data_; +} diff --git a/src/logger.hpp b/src/logger.hpp index 8b64bf68f..f2ff05762 100644 --- a/src/logger.hpp +++ b/src/logger.hpp @@ -31,6 +31,7 @@ class Logger { public: static void set_log_level(CassLogLevel level); static void set_callback(CassLogCallback cb, void* data); + static void get_callback_and_data(CassLogCallback* cb_out, void** data_out); #if defined(__GNUC__) || defined(__clang__) #define ATTR_FORMAT(string, first) __attribute__((__format__(__printf__, string, first))) diff --git a/tests/src/integration/logger.cpp b/tests/src/integration/logger.cpp index e8ad5008e..d78b982bd 100644 --- a/tests/src/integration/logger.cpp +++ b/tests/src/integration/logger.cpp @@ -44,6 +44,10 @@ Logger::~Logger() { if (output_.is_open()) { output_.close(); } + if (restore_old_logger_) { + // `initialize` has beed called, so let's restore global logger + cass_log_set_callback(old_log_callback_, old_data_); + } } void Logger::initialize(const std::string& test_case, const std::string& test_name) { @@ -72,6 +76,10 @@ void Logger::initialize(const std::string& test_case, const std::string& test_na // Set the maximum driver log level to capture all logs messages cass_log_set_level(CASS_LOG_TRACE); + + // Remember the old logger before setting it (to be restored in dtor) + cass_log_get_callback_and_data(&old_log_callback_, &old_data_); + restore_old_logger_ = true; cass_log_set_callback(Logger::log, this); } diff --git a/tests/src/integration/logger.hpp b/tests/src/integration/logger.hpp index 82ea20233..280eac53b 100644 --- a/tests/src/integration/logger.hpp +++ b/tests/src/integration/logger.hpp @@ -97,6 +97,11 @@ class Logger { * Number of log messages that match the search criteria */ size_t count_; + + /** We need these to restore the globals on teardown. */ + bool restore_old_logger_ = false; + CassLogCallback old_log_callback_; + void* old_data_; /** * Log the message from the driver (callback)