mirror of
https://github.com/gabime/spdlog.git
synced 2025-09-28 17:19:34 +08:00
@@ -19,9 +19,9 @@ if(Catch2_FOUND)
|
||||
else()
|
||||
message(STATUS "Bundled version of Catch will be downloaded and used.")
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(Catch2
|
||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||
GIT_TAG 53d0d913a422d356b23dd927547febdf69ee9081 # v3.5.0
|
||||
FetchContent_Declare(
|
||||
Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||
GIT_TAG 53d0d913a422d356b23dd927547febdf69ee9081 # v3.5.0
|
||||
)
|
||||
FetchContent_MakeAvailable(Catch2)
|
||||
endif()
|
||||
@@ -71,9 +71,9 @@ function(spdlog_prepare_test test_target spdlog_lib)
|
||||
target_link_libraries(${test_target} PRIVATE Catch2::Catch2WithMain)
|
||||
if(SPDLOG_SANITIZE_ADDRESS)
|
||||
spdlog_enable_addr_sanitizer(${test_target})
|
||||
elseif (SPDLOG_SANITIZE_THREAD)
|
||||
elseif(SPDLOG_SANITIZE_THREAD)
|
||||
spdlog_enable_thread_sanitizer(${test_target})
|
||||
endif ()
|
||||
endif()
|
||||
add_test(NAME ${test_target} COMMAND ${test_target})
|
||||
set_tests_properties(${test_target} PROPERTIES RUN_SERIAL ON)
|
||||
endfunction()
|
||||
|
@@ -16,7 +16,8 @@ TEST_CASE("custom_callback_logger", "[custom_callback_logger]") {
|
||||
spdlog::memory_buf_t formatted;
|
||||
formatter.format(msg, formatted);
|
||||
auto eol_len = strlen(spdlog::details::os::default_eol);
|
||||
using diff_t = typename std::iterator_traits<decltype(formatted.end())>::difference_type;
|
||||
using diff_t =
|
||||
typename std::iterator_traits<decltype(formatted.end())>::difference_type;
|
||||
lines.emplace_back(formatted.begin(), formatted.end() - static_cast<diff_t>(eol_len));
|
||||
});
|
||||
std::shared_ptr<spdlog::sinks::test_sink_st> test_sink(new spdlog::sinks::test_sink_st);
|
||||
|
@@ -46,10 +46,8 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger]") {
|
||||
|
||||
struct custom_daily_file_name_calculator {
|
||||
static spdlog::filename_t calc_filename(const spdlog::filename_t &basename, const tm &now_tm) {
|
||||
|
||||
return spdlog::fmt_lib::format(SPDLOG_FILENAME_T("{}{:04d}{:02d}{:02d}"),
|
||||
basename, now_tm.tm_year + 1900, now_tm.tm_mon + 1,
|
||||
now_tm.tm_mday);
|
||||
return spdlog::fmt_lib::format(SPDLOG_FILENAME_T("{}{:04d}{:02d}{:02d}"), basename,
|
||||
now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -56,7 +56,7 @@ TEST_CASE("simple_file_logger", "[truncate]") {
|
||||
logger->info("Test message {}", 2.71);
|
||||
logger->flush();
|
||||
REQUIRE(count_lines(SIMPLE_LOG) == 2);
|
||||
|
||||
|
||||
sink->truncate();
|
||||
REQUIRE(count_lines(SIMPLE_LOG) == 0);
|
||||
|
||||
@@ -94,14 +94,11 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]") {
|
||||
// next logger can rename the first output file.
|
||||
spdlog::drop(logger->name());
|
||||
}
|
||||
|
||||
auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 2, true);
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
logger->info("Test message {}", i);
|
||||
}
|
||||
|
||||
logger->flush();
|
||||
|
||||
require_message_count(ROTATING_LOG, 10);
|
||||
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
@@ -141,3 +138,50 @@ TEST_CASE("rotating_file_logger4", "[rotating_logger]") {
|
||||
REQUIRE(get_filesize(ROTATING_LOG) > 0);
|
||||
REQUIRE(get_filesize(ROTATING_LOG ".1") > 0);
|
||||
}
|
||||
|
||||
// test changing the max size of the rotating file sink
|
||||
TEST_CASE("rotating_file_logger5", "[rotating_logger]") {
|
||||
prepare_logdir();
|
||||
size_t max_size = 5 * 1024;
|
||||
size_t max_files = 2;
|
||||
spdlog::filename_t basename = SPDLOG_FILENAME_T(ROTATING_LOG);
|
||||
auto sink =
|
||||
std::make_shared<spdlog::sinks::rotating_file_sink_st>(basename, max_size, max_files);
|
||||
auto logger = std::make_shared<spdlog::logger>("rotating_sink_logger", sink);
|
||||
logger->set_pattern("%v");
|
||||
|
||||
REQUIRE(sink->get_max_size() == max_size);
|
||||
REQUIRE(sink->get_max_files() == max_files);
|
||||
max_size = 7 * 1024;
|
||||
max_files = 3;
|
||||
|
||||
sink->set_max_size(max_size);
|
||||
sink->set_max_files(max_files);
|
||||
REQUIRE(sink->get_max_size() == max_size);
|
||||
REQUIRE(sink->get_max_files() == max_files);
|
||||
|
||||
const auto message = std::string(200, 'x');
|
||||
assert(message.size() < max_size);
|
||||
const auto n_messages = max_files * max_size / message.size();
|
||||
for (size_t i = 0; i < n_messages; ++i) {
|
||||
logger->info(message);
|
||||
}
|
||||
logger.reset(); // force flush and close the file
|
||||
|
||||
// validate that the files were rotated correctly with the new max size and max files
|
||||
for (size_t i = 0; i <= max_files; i++) {
|
||||
// calc filenames
|
||||
// e.g. rotating_log, rotating_log.0 rotating_log.1, rotating_log.2, etc.
|
||||
std::ostringstream oss;
|
||||
oss << ROTATING_LOG;
|
||||
if (i > 0) {
|
||||
oss << '.' << i;
|
||||
}
|
||||
const auto filename = oss.str();
|
||||
const auto filesize = get_filesize(filename);
|
||||
REQUIRE(filesize <= max_size);
|
||||
if (i > 0) {
|
||||
REQUIRE(filesize >= max_size - message.size() - 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,12 +1,12 @@
|
||||
#ifdef _WIN32 // to prevent fopen warning on windows
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#ifdef _WIN32 // to prevent fopen warning on windows
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include "includes.h"
|
||||
#include "test_sink.h"
|
||||
|
||||
template <class T>
|
||||
std::string log_info(const T &what, spdlog::level::level_enum logger_level = spdlog::level::info) {
|
||||
std::string log_info(const T& what, spdlog::level::level_enum logger_level = spdlog::level::info) {
|
||||
std::ostringstream oss;
|
||||
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
|
||||
|
||||
@@ -182,17 +182,19 @@ TEST_CASE("utf8 to utf16 conversion using windows api", "[windows utf]") {
|
||||
spdlog::details::os::utf8_to_wstrbuf("abc", buffer);
|
||||
REQUIRE(std::wstring(buffer.data(), buffer.size()) == std::wstring(L"abc"));
|
||||
|
||||
spdlog::details::os::utf8_to_wstrbuf("\xc3\x28", buffer); // Invalid UTF-8 sequence.
|
||||
spdlog::details::os::utf8_to_wstrbuf("\xc3\x28", buffer); // Invalid UTF-8 sequence.
|
||||
REQUIRE(std::wstring(buffer.data(), buffer.size()) == std::wstring(L"\xfffd("));
|
||||
|
||||
spdlog::details::os::utf8_to_wstrbuf("\xe3\x81\xad\xe3\x81\x93", buffer); // "Neko" in hiragana.
|
||||
spdlog::details::os::utf8_to_wstrbuf("\xe3\x81\xad\xe3\x81\x93",
|
||||
buffer); // "Neko" in hiragana.
|
||||
REQUIRE(std::wstring(buffer.data(), buffer.size()) == std::wstring(L"\x306d\x3053"));
|
||||
}
|
||||
#endif
|
||||
|
||||
struct auto_closer {
|
||||
FILE* fp = nullptr;
|
||||
explicit auto_closer(FILE* f) : fp(f) {}
|
||||
explicit auto_closer(FILE* f)
|
||||
: fp(f) {}
|
||||
auto_closer(const auto_closer&) = delete;
|
||||
auto_closer& operator=(const auto_closer&) = delete;
|
||||
~auto_closer() {
|
||||
@@ -201,10 +203,10 @@ struct auto_closer {
|
||||
};
|
||||
|
||||
TEST_CASE("os::fwrite_bytes", "[os]") {
|
||||
using spdlog::details::os::fwrite_bytes;
|
||||
using spdlog::details::os::create_dir;
|
||||
using spdlog::details::os::fwrite_bytes;
|
||||
const char* filename = "log_tests/test_fwrite_bytes.txt";
|
||||
const char *msg = "hello";
|
||||
const char* msg = "hello";
|
||||
prepare_logdir();
|
||||
REQUIRE(create_dir(SPDLOG_FILENAME_T("log_tests")) == true);
|
||||
{
|
||||
|
@@ -23,7 +23,9 @@ static std::string log_to_str(const std::string &msg, const Args &...args) {
|
||||
|
||||
// log to str and return it with time
|
||||
template <typename... Args>
|
||||
static std::string log_to_str_with_time(spdlog::log_clock::time_point log_time, const std::string &msg, const Args &...args) {
|
||||
static std::string log_to_str_with_time(spdlog::log_clock::time_point log_time,
|
||||
const std::string &msg,
|
||||
const Args &...args) {
|
||||
std::ostringstream oss;
|
||||
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
|
||||
spdlog::logger oss_logger("pattern_tester", oss_sink);
|
||||
@@ -80,8 +82,8 @@ TEST_CASE("GMT offset ", "[pattern_formatter]") {
|
||||
const auto now = std::chrono::system_clock::now();
|
||||
const auto yesterday = now - 24h;
|
||||
|
||||
REQUIRE(log_to_str_with_time(yesterday, "Some message", "%z", spdlog::pattern_time_type::utc, "\n") ==
|
||||
"+00:00\n");
|
||||
REQUIRE(log_to_str_with_time(yesterday, "Some message", "%z", spdlog::pattern_time_type::utc,
|
||||
"\n") == "+00:00\n");
|
||||
}
|
||||
|
||||
TEST_CASE("color range test1", "[pattern_formatter]") {
|
||||
|
@@ -47,7 +47,7 @@ protected:
|
||||
base_sink<Mutex>::formatter_->format(msg, formatted);
|
||||
// save the line without the eol
|
||||
auto eol_len = strlen(details::os::default_eol);
|
||||
using diff_t = typename std::iterator_traits<decltype(formatted.end())>::difference_type;
|
||||
using diff_t = typename std::iterator_traits<decltype(formatted.end())>::difference_type;
|
||||
if (lines_.size() < lines_to_save) {
|
||||
lines_.emplace_back(formatted.begin(), formatted.end() - static_cast<diff_t>(eol_len));
|
||||
}
|
||||
|
@@ -50,9 +50,8 @@ void require_message_count(const std::string &filename, const std::size_t messag
|
||||
std::size_t get_filesize(const std::string &filename) {
|
||||
std::ifstream ifs(filename, std::ifstream::ate | std::ifstream::binary);
|
||||
if (!ifs) {
|
||||
throw std::runtime_error("Failed open file ");
|
||||
throw std::runtime_error("Failed open file " + filename);
|
||||
}
|
||||
|
||||
return static_cast<std::size_t>(ifs.tellg());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user