From 22122f390192ffaa67b8e62fdf7ac7aa630956c0 Mon Sep 17 00:00:00 2001 From: gabime Date: Sat, 29 Mar 2025 13:58:40 +0300 Subject: [PATCH] Merge PR #3366 from 1.x (Fix zformatter on Apple and POSIX.1-2024 conforming platform) --- src/details/os_unix.cpp | 6 ++++-- tests/test_pattern_formatter.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/details/os_unix.cpp b/src/details/os_unix.cpp index 5149828b..5c5828f3 100644 --- a/src/details/os_unix.cpp +++ b/src/details/os_unix.cpp @@ -129,8 +129,10 @@ size_t filesize(FILE *f) { // Return utc offset in minutes or throw spdlog_ex on failure int utc_minutes_offset(const std::tm &tm) { -#if defined(sun) || defined(__sun) || defined(_AIX) || (defined(__NEWLIB__) && !defined(__TM_GMTOFF)) || \ - (!defined(_BSD_SOURCE) && !defined(_GNU_SOURCE)) + #if defined(sun) || defined(__sun) || defined(_AIX) || \ + (defined(__NEWLIB__) && !defined(__TM_GMTOFF)) || \ + (!defined(__APPLE__) && !defined(_BSD_SOURCE) && !defined(_GNU_SOURCE) && \ + (!defined(_POSIX_VERSION) || (_POSIX_VERSION < 202405L))) // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris struct helper { static long int calculate_gmt_offset(const std::tm &localtm = details::os::localtime(), diff --git a/tests/test_pattern_formatter.cpp b/tests/test_pattern_formatter.cpp index 85f2114b..bcc61f18 100644 --- a/tests/test_pattern_formatter.cpp +++ b/tests/test_pattern_formatter.cpp @@ -2,6 +2,8 @@ #include "spdlog/sinks/ostream_sink.h" #include "test_sink.h" +#include + using spdlog::memory_buf_t; // log to str and return it @@ -18,6 +20,21 @@ static std::string log_to_str(const std::string &msg, const Args &...args) { return oss.str(); } +// log to str and return it with time +template +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(oss); + spdlog::logger oss_logger("pattern_tester", oss_sink); + oss_logger.set_level(spdlog::level::info); + + oss_logger.set_formatter( + std::unique_ptr(new spdlog::pattern_formatter(args...))); + + oss_logger.log(log_time, {}, spdlog::level::info, msg); + return oss.str(); +} + TEST_CASE("custom eol", "[pattern_formatter]") { std::string msg = "Hello custom eol test"; std::string eol = ";)"; @@ -52,6 +69,15 @@ TEST_CASE("date MM/DD/YY ", "[pattern_formatter]") { REQUIRE(log_to_str("Some message", "%D %v", spdlog::pattern_time_type::local, "\n") == oss.str()); } +TEST_CASE("GMT offset ", "[pattern_formatter]") { + using namespace std::chrono_literals; + 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"); +} + TEST_CASE("color range test1", "[pattern_formatter]") { auto formatter = std::make_shared("%^%v%$", spdlog::pattern_time_type::local, "\n");