Skip to content

Commit 7e635fc

Browse files
committed
Fixed #2724 by excluding bin_to_hex sink if using std::format
1 parent bed324e commit 7e635fc

File tree

4 files changed

+105
-92
lines changed

4 files changed

+105
-92
lines changed

example/example.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ void replace_default_logger_example();
3131
#include "spdlog/cfg/env.h" // support for loading levels from the environment variable
3232
#include "spdlog/fmt/ostr.h" // support for user defined types
3333

34+
3435
int main(int, char *[])
3536
{
3637
// Log levels can be loaded from argv/env using "SPDLOG_LEVEL"
@@ -183,6 +184,7 @@ void async_example()
183184
// {:p} - don't print the position on each line start.
184185
// {:n} - don't split the output to lines.
185186

187+
#if !defined SPDLOG_USE_STD_FORMAT || defined(_MSC_VER)
186188
#include "spdlog/fmt/bin_to_hex.h"
187189
void binary_example()
188190
{
@@ -200,6 +202,11 @@ void binary_example()
200202
// logger->info("hexdump style: {:a}", spdlog::to_hex(buf));
201203
// logger->info("hexdump style, 20 chars per line {:a}", spdlog::to_hex(buf, 20));
202204
}
205+
#else
206+
void binary_example() {
207+
// not supported with std::format yet
208+
}
209+
#endif
203210

204211
// Log a vector of numbers
205212
#ifndef SPDLOG_USE_STD_FORMAT
@@ -287,7 +294,7 @@ struct fmt::formatter<my_type> : fmt::formatter<std::string>
287294
template<>
288295
struct std::formatter<my_type> : std::formatter<std::string>
289296
{
290-
auto format(my_type my, format_context &ctx) -> decltype(ctx.out())
297+
auto format(my_type my, format_context &ctx) const -> decltype(ctx.out())
291298
{
292299
return format_to(ctx.out(), "[my_type i={}]", my.i);
293300
}

tests/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ if(systemd_FOUND)
5454
list(APPEND SPDLOG_UTESTS_SOURCES test_systemd.cpp)
5555
endif()
5656

57+
if(NOT SPDLOG_USE_STD_FORMAT)
58+
list(APPEND SPDLOG_UTESTS_SOURCES test_bin_to_hex.cpp)
59+
endif()
60+
5761
enable_testing()
5862

5963
function(spdlog_prepare_test test_target spdlog_lib)

tests/test_bin_to_hex.cpp

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include "includes.h"
2+
#include "test_sink.h"
3+
#include "spdlog/fmt/bin_to_hex.h"
4+
5+
TEST_CASE("to_hex", "[to_hex]")
6+
{
7+
std::ostringstream oss;
8+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
9+
spdlog::logger oss_logger("oss", oss_sink);
10+
11+
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
12+
oss_logger.info("{}", spdlog::to_hex(v));
13+
14+
auto output = oss.str();
15+
REQUIRE(ends_with(output, "0000: 09 0a 0b 0c ff ff" + std::string(spdlog::details::os::default_eol)));
16+
}
17+
18+
TEST_CASE("to_hex_upper", "[to_hex]")
19+
{
20+
std::ostringstream oss;
21+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
22+
spdlog::logger oss_logger("oss", oss_sink);
23+
24+
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
25+
oss_logger.info("{:X}", spdlog::to_hex(v));
26+
27+
auto output = oss.str();
28+
REQUIRE(ends_with(output, "0000: 09 0A 0B 0C FF FF" + std::string(spdlog::details::os::default_eol)));
29+
}
30+
31+
TEST_CASE("to_hex_no_delimiter", "[to_hex]")
32+
{
33+
std::ostringstream oss;
34+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
35+
spdlog::logger oss_logger("oss", oss_sink);
36+
37+
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
38+
oss_logger.info("{:sX}", spdlog::to_hex(v));
39+
40+
auto output = oss.str();
41+
REQUIRE(ends_with(output, "0000: 090A0B0CFFFF" + std::string(spdlog::details::os::default_eol)));
42+
}
43+
44+
TEST_CASE("to_hex_show_ascii", "[to_hex]")
45+
{
46+
std::ostringstream oss;
47+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
48+
spdlog::logger oss_logger("oss", oss_sink);
49+
50+
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
51+
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 8));
52+
53+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF ...A.K.." + std::string(spdlog::details::os::default_eol)));
54+
}
55+
56+
TEST_CASE("to_hex_different_size_per_line", "[to_hex]")
57+
{
58+
std::ostringstream oss;
59+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
60+
spdlog::logger oss_logger("oss", oss_sink);
61+
62+
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
63+
64+
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 10));
65+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF ...A.K.." + std::string(spdlog::details::os::default_eol)));
66+
67+
oss_logger.info("{:Xs}", spdlog::to_hex(v, 10));
68+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
69+
70+
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 6));
71+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4B ...A.K" + std::string(spdlog::details::os::default_eol) + "0006: FFFF .." +
72+
std::string(spdlog::details::os::default_eol)));
73+
74+
oss_logger.info("{:Xs}", spdlog::to_hex(v, 6));
75+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4B" + std::string(spdlog::details::os::default_eol) + "0006: FFFF" +
76+
std::string(spdlog::details::os::default_eol)));
77+
}
78+
79+
TEST_CASE("to_hex_no_ascii", "[to_hex]")
80+
{
81+
std::ostringstream oss;
82+
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
83+
spdlog::logger oss_logger("oss", oss_sink);
84+
85+
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
86+
oss_logger.info("{:Xs}", spdlog::to_hex(v, 8));
87+
88+
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
89+
90+
oss_logger.info("{:Xsna}", spdlog::to_hex(v, 8));
91+
92+
REQUIRE(ends_with(oss.str(), "090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
93+
}

tests/test_misc.cpp

-91
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "includes.h"
22
#include "test_sink.h"
3-
#include "spdlog/fmt/bin_to_hex.h"
43

54
template<class T>
65
std::string log_info(const T &what, spdlog::level::level_enum logger_level = spdlog::level::info)
@@ -140,96 +139,6 @@ TEST_CASE("clone async", "[clone]")
140139
spdlog::drop_all();
141140
}
142141

143-
TEST_CASE("to_hex", "[to_hex]")
144-
{
145-
std::ostringstream oss;
146-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
147-
spdlog::logger oss_logger("oss", oss_sink);
148-
149-
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
150-
oss_logger.info("{}", spdlog::to_hex(v));
151-
152-
auto output = oss.str();
153-
REQUIRE(ends_with(output, "0000: 09 0a 0b 0c ff ff" + std::string(spdlog::details::os::default_eol)));
154-
}
155-
156-
TEST_CASE("to_hex_upper", "[to_hex]")
157-
{
158-
std::ostringstream oss;
159-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
160-
spdlog::logger oss_logger("oss", oss_sink);
161-
162-
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
163-
oss_logger.info("{:X}", spdlog::to_hex(v));
164-
165-
auto output = oss.str();
166-
REQUIRE(ends_with(output, "0000: 09 0A 0B 0C FF FF" + std::string(spdlog::details::os::default_eol)));
167-
}
168-
169-
TEST_CASE("to_hex_no_delimiter", "[to_hex]")
170-
{
171-
std::ostringstream oss;
172-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
173-
spdlog::logger oss_logger("oss", oss_sink);
174-
175-
std::vector<unsigned char> v{9, 0xa, 0xb, 0xc, 0xff, 0xff};
176-
oss_logger.info("{:sX}", spdlog::to_hex(v));
177-
178-
auto output = oss.str();
179-
REQUIRE(ends_with(output, "0000: 090A0B0CFFFF" + std::string(spdlog::details::os::default_eol)));
180-
}
181-
182-
TEST_CASE("to_hex_show_ascii", "[to_hex]")
183-
{
184-
std::ostringstream oss;
185-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
186-
spdlog::logger oss_logger("oss", oss_sink);
187-
188-
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
189-
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 8));
190-
191-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF ...A.K.." + std::string(spdlog::details::os::default_eol)));
192-
}
193-
194-
TEST_CASE("to_hex_different_size_per_line", "[to_hex]")
195-
{
196-
std::ostringstream oss;
197-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
198-
spdlog::logger oss_logger("oss", oss_sink);
199-
200-
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
201-
202-
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 10));
203-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF ...A.K.." + std::string(spdlog::details::os::default_eol)));
204-
205-
oss_logger.info("{:Xs}", spdlog::to_hex(v, 10));
206-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
207-
208-
oss_logger.info("{:Xsa}", spdlog::to_hex(v, 6));
209-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4B ...A.K" + std::string(spdlog::details::os::default_eol) + "0006: FFFF .." +
210-
std::string(spdlog::details::os::default_eol)));
211-
212-
oss_logger.info("{:Xs}", spdlog::to_hex(v, 6));
213-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4B" + std::string(spdlog::details::os::default_eol) + "0006: FFFF" +
214-
std::string(spdlog::details::os::default_eol)));
215-
}
216-
217-
TEST_CASE("to_hex_no_ascii", "[to_hex]")
218-
{
219-
std::ostringstream oss;
220-
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
221-
spdlog::logger oss_logger("oss", oss_sink);
222-
223-
std::vector<unsigned char> v{9, 0xa, 0xb, 0x41, 0xc, 0x4b, 0xff, 0xff};
224-
oss_logger.info("{:Xs}", spdlog::to_hex(v, 8));
225-
226-
REQUIRE(ends_with(oss.str(), "0000: 090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
227-
228-
oss_logger.info("{:Xsna}", spdlog::to_hex(v, 8));
229-
230-
REQUIRE(ends_with(oss.str(), "090A0B410C4BFFFF" + std::string(spdlog::details::os::default_eol)));
231-
}
232-
233142
TEST_CASE("default logger API", "[default logger]")
234143
{
235144
std::ostringstream oss;

0 commit comments

Comments
 (0)