Skip to content

Commit 11723f6

Browse files
committed
Improve test coverage
Signed-off-by: JCW <[email protected]>
1 parent 7613dd4 commit 11723f6

File tree

2 files changed

+172
-24
lines changed

2 files changed

+172
-24
lines changed

include/xrpl/beast/utility/Journal.h

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ class Journal
638638
operator=(Journal const& other)
639639
{
640640
if (&other == this)
641-
return *this;
641+
return *this; // LCOV_EXCL_LINE
642642

643643
m_sink = other.m_sink;
644644
m_name = other.m_name;
@@ -874,6 +874,13 @@ concept ToCharsFormattable = requires(T val) {
874874
} -> std::convertible_to<std::to_chars_result>;
875875
};
876876

877+
template <typename T>
878+
concept StreamFormattable = requires(T val) {
879+
{
880+
std::declval<std::ostream&>() << val
881+
} -> std::convertible_to<std::ostream&>;
882+
};
883+
877884
template <typename T>
878885
void
879886
setJsonValue(
@@ -941,12 +948,14 @@ setJsonValue(
941948
outStream->write(value, std::strlen(value));
942949
}
943950
}
944-
else if constexpr (std::is_same_v<ValueType, std::string>)
951+
else if constexpr (
952+
std::is_same_v<ValueType, std::string> ||
953+
std::is_same_v<ValueType, std::string_view>)
945954
{
946955
writer.writeString(value);
947956
if (outStream)
948957
{
949-
outStream->write(value.c_str(), value.length());
958+
outStream->write(value.data(), value.size());
950959
}
951960
}
952961
else
@@ -968,19 +977,26 @@ setJsonValue(
968977
}
969978
}
970979

971-
std::ostringstream oss;
972-
oss.imbue(std::locale::classic());
973-
oss << value;
980+
if constexpr (StreamFormattable<ValueType>)
981+
{
982+
std::ostringstream oss;
983+
oss.imbue(std::locale::classic());
984+
oss << value;
974985

975-
auto str = oss.str();
986+
auto str = oss.str();
976987

977-
writer.writeString(str);
988+
writer.writeString(str);
978989

979-
if (outStream)
980-
{
981-
outStream->write(
982-
str.c_str(), static_cast<std::streamsize>(str.size()));
990+
if (outStream)
991+
{
992+
outStream->write(
993+
str.c_str(), static_cast<std::streamsize>(str.size()));
994+
}
995+
996+
return;
983997
}
998+
999+
static_assert(ToCharsFormattable<ValueType> || StreamFormattable<ValueType>);
9841000
}
9851001
}
9861002
} // namespace detail
@@ -990,7 +1006,10 @@ std::ostream&
9901006
operator<<(std::ostream& os, LogParameter<T> const& param)
9911007
{
9921008
if (!beast::Journal::m_jsonLogsEnabled)
1009+
{
1010+
os << param.value_;
9931011
return os;
1012+
}
9941013
detail::setJsonValue(
9951014
beast::Journal::currentJsonLogContext_.writer(),
9961015
param.name_,

src/tests/libxrpl/basics/log.cpp

Lines changed: 141 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ TEST_CASE("Test JsonWriter")
234234
std::string buffer;
235235
beast::detail::SimpleJsonWriter writer{buffer};
236236

237-
writer.writeString("\n");
238-
CHECK(writer.finish() == "\"\\n\"");
237+
writer.writeString("\n\r\t123\b\f123");
238+
CHECK(writer.finish() == "\"\\n\\r\\t123\\b\\f123\"");
239239
}
240240

241241
{
@@ -261,6 +261,76 @@ TEST_CASE("Test JsonWriter")
261261
writer.writeString("\"\\");
262262
CHECK(writer.finish() == "\"\\\"\\\\\"");
263263
}
264+
265+
{
266+
std::string buffer;
267+
beast::detail::SimpleJsonWriter writer{buffer};
268+
269+
writer.startArray();
270+
writer.writeBool(true);
271+
writer.writeBool(false);
272+
writer.writeNull();
273+
writer.endArray();
274+
CHECK(writer.finish() == "[true,false,null]");
275+
}
276+
}
277+
278+
namespace test_detail {
279+
struct ToCharsStruct{};
280+
281+
std::to_chars_result
282+
to_chars(char* first, char* last, ToCharsStruct)
283+
{
284+
*first = '0';
285+
return std::to_chars_result{first + 1, std::errc{}};
286+
}
287+
288+
struct StreamStruct
289+
{
290+
};
291+
292+
std::ostream&
293+
operator<<(std::ostream& os, StreamStruct)
294+
{
295+
os << "0";
296+
return os;
297+
}
298+
299+
}
300+
301+
TEST_CASE("Test setJsonValue")
302+
{
303+
std::ostringstream stringBuf;
304+
std::string buffer;
305+
beast::detail::SimpleJsonWriter writer{buffer};
306+
writer.startObject();
307+
308+
log::detail::setJsonValue<bool>(writer, "testBool", true, &stringBuf);
309+
log::detail::setJsonValue<std::int32_t>(writer, "testInt32", 1, &stringBuf);
310+
log::detail::setJsonValue<std::uint32_t>(writer, "testUInt32", -1, &stringBuf);
311+
log::detail::setJsonValue<std::int64_t>(writer, "testInt64", 1, &stringBuf);
312+
log::detail::setJsonValue<std::uint64_t>(writer, "testUInt64", -1, &stringBuf);
313+
log::detail::setJsonValue<double>(writer, "testDouble", 1.1, &stringBuf);
314+
log::detail::setJsonValue<char const*>(writer, "testCharStar", "Char*", &stringBuf);
315+
log::detail::setJsonValue<std::string>(writer, "testStdString", "StdString", &stringBuf);
316+
log::detail::setJsonValue<std::string_view>(writer, "testStdStringView", "StdStringView", &stringBuf);
317+
log::detail::setJsonValue<test_detail::ToCharsStruct>(writer, "testToChars", {}, &stringBuf);
318+
log::detail::setJsonValue<test_detail::StreamStruct>(writer, "testStream", {}, &stringBuf);
319+
}
320+
321+
TEST_CASE("Test json logging not enabled")
322+
{
323+
std::string logStream;
324+
325+
MockLogs logs{logStream, beast::severities::kAll};
326+
327+
beast::Journal::disableStructuredJournal();
328+
beast::Journal::addGlobalAttributes(
329+
log::attributes(log::attr("Field1", "Value1")));
330+
331+
logs.journal("Test123").debug() << "Test " << log::param(" Field1", "Value1") << log::field("Field2", "Value2");
332+
333+
CHECK(logStream.find("Test Value1") != std::string::npos);
264334
}
265335

266336
/**
@@ -322,7 +392,7 @@ class JsonLogStreamFixture
322392
beast::Journal j_;
323393
};
324394

325-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogFields")
395+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test json log fields")
326396
{
327397
beast::Journal::addGlobalAttributes(
328398
log::attributes(log::attr("Field2", "Value2")));
@@ -367,7 +437,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogFields")
367437
std::string{"true Test false"});
368438
}
369439

370-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogLevels")
440+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test json log levels")
371441
{
372442
{
373443
stream().str("");
@@ -460,7 +530,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogLevels")
460530
}
461531
}
462532

463-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogStream")
533+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test json log stream")
464534
{
465535
journal().stream(beast::severities::kError) << "Test";
466536

@@ -475,7 +545,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogStream")
475545
beast::severities::to_string(beast::severities::kError));
476546
}
477547

478-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogParams")
548+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test json log params")
479549
{
480550
journal().debug() << "Test: " << log::param("Field1", 1) << ", "
481551
<< log::param(
@@ -513,7 +583,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogParams")
513583
std::string{"Test: 1, 18446744073709551615, 3.141592653589793"});
514584
}
515585

516-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogFields")
586+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test json log fields")
517587
{
518588
journal().debug() << "Test" << log::field("Field1", 1)
519589
<< log::field(
@@ -546,7 +616,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJsonLogFields")
546616
CHECK(logValue.as_object()["Message"].get_string() == "Test");
547617
}
548618

549-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJournalAttributes")
619+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test journal attributes")
550620
{
551621
beast::Journal j{
552622
journal(),
@@ -574,7 +644,7 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJournalAttributes")
574644
.get_int64() == 2);
575645
}
576646

577-
TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJournalAttributesInheritable")
647+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test journal attributes inheritable")
578648
{
579649
beast::Journal j{
580650
journal(),
@@ -610,9 +680,68 @@ TEST_CASE_FIXTURE(JsonLogStreamFixture, "TestJournalAttributesInheritable")
610680
.get_int64() == 2);
611681
}
612682

683+
TEST_CASE_FIXTURE(JsonLogStreamFixture, "Test copying journal")
684+
{
685+
{
686+
beast::Journal j{
687+
journal(),
688+
log::attributes(log::attr("Field1", "Value1"), log::attr("Field2", 2))};
689+
beast::Journal j2{j};
690+
691+
j2.debug() << "Test";
692+
693+
boost::system::error_code ec;
694+
auto logValue = boost::json::parse(stream().str(), ec);
695+
CHECK(ec == boost::system::errc::success);
696+
697+
CHECK(logValue.as_object()["JournalParams"]
698+
.as_object()["Field1"]
699+
.is_string());
700+
CHECK(
701+
logValue.as_object()["JournalParams"]
702+
.as_object()["Field1"]
703+
.get_string() == std::string{"Value1"});
704+
CHECK(logValue.as_object()["JournalParams"]
705+
.as_object()["Field2"]
706+
.is_number());
707+
CHECK(
708+
logValue.as_object()["JournalParams"]
709+
.as_object()["Field2"]
710+
.get_int64() == 2);
711+
}
712+
{
713+
stream().str("");
714+
beast::Journal j{
715+
journal().sink()};
716+
beast::Journal j2{j,
717+
log::attributes(log::attr("Field1", "Value1"), log::attr("Field2", 2))};
718+
719+
j2.debug() << "Test";
720+
721+
boost::system::error_code ec;
722+
auto logValue = boost::json::parse(stream().str(), ec);
723+
CHECK(ec == boost::system::errc::success);
724+
725+
CHECK(logValue.as_object()["JournalParams"]
726+
.as_object()["Field1"]
727+
.is_string());
728+
CHECK(
729+
logValue.as_object()["JournalParams"]
730+
.as_object()["Field1"]
731+
.get_string() == std::string{"Value1"});
732+
CHECK(logValue.as_object()["JournalParams"]
733+
.as_object()["Field2"]
734+
.is_number());
735+
CHECK(
736+
logValue.as_object()["JournalParams"]
737+
.as_object()["Field2"]
738+
.get_int64() == 2);
739+
}
740+
}
741+
613742
TEST_CASE_FIXTURE(
614743
JsonLogStreamFixture,
615-
"TestJournalAttributesInheritableAfterMoving")
744+
"Test journal attributes inheritable after moving")
616745
{
617746
beast::Journal j{
618747
journal(),
@@ -651,7 +780,7 @@ TEST_CASE_FIXTURE(
651780

652781
TEST_CASE_FIXTURE(
653782
JsonLogStreamFixture,
654-
"TestJournalAttributesInheritableAfterCopyAssignment")
783+
"Test journal attributes inheritable after copy assignment")
655784
{
656785
beast::Journal j{
657786
std::move(journal()),
@@ -685,7 +814,7 @@ TEST_CASE_FIXTURE(
685814

686815
TEST_CASE_FIXTURE(
687816
JsonLogStreamFixture,
688-
"TestJournalAttributesInheritableAfterMoveAssignment")
817+
"Test journal attributes inheritable after move assignment")
689818
{
690819
beast::Journal j{
691820
journal(),

0 commit comments

Comments
 (0)