This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new 3d750063 Add some more name abbreviation test cases (#749)
3d750063 is described below
commit 3d75006385387f57b8af4099982847b25faa663e
Author: Stephen Webb <[email protected]>
AuthorDate: Tue Sep 1 10:07:26 2026 +1000
Add some more name abbreviation test cases (#749)
---
src/main/cpp/classnamepatternconverter.cpp | 5 +--
src/main/cpp/loggerpatternconverter.cpp | 5 +--
src/main/cpp/nameabbreviator.cpp | 29 ++++++----------
src/main/include/log4cxx/pattern/nameabbreviator.h | 8 ++---
.../include/log4cxx/pattern/namepatternconverter.h | 5 +--
src/test/cpp/patternlayouttest.cpp | 40 +++++++++++++++++-----
6 files changed, 56 insertions(+), 36 deletions(-)
diff --git a/src/main/cpp/classnamepatternconverter.cpp
b/src/main/cpp/classnamepatternconverter.cpp
index 1afe6b35..1972d7de 100644
--- a/src/main/cpp/classnamepatternconverter.cpp
+++ b/src/main/cpp/classnamepatternconverter.cpp
@@ -42,7 +42,8 @@ PatternConverterPtr ClassNamePatternConverter::newInstance(
void ClassNamePatternConverter::format( LOG4CXX_FORMAT_EVENT_FORMAL_PARAMETERS
) const
{
- int initialLength = (int)toAppendTo.length();
+ auto initialLength = toAppendTo.length();
append(toAppendTo, event->getLocationInformation().getClassName());
- abbreviate(initialLength, toAppendTo);
+ if (initialLength < toAppendTo.length())
+ abbreviate(initialLength, toAppendTo);
}
diff --git a/src/main/cpp/loggerpatternconverter.cpp
b/src/main/cpp/loggerpatternconverter.cpp
index e8ce5a31..3704b7dc 100644
--- a/src/main/cpp/loggerpatternconverter.cpp
+++ b/src/main/cpp/loggerpatternconverter.cpp
@@ -42,7 +42,8 @@ PatternConverterPtr LoggerPatternConverter::newInstance(
void LoggerPatternConverter::format( LOG4CXX_FORMAT_EVENT_FORMAL_PARAMETERS )
const
{
- int initialLength = (int)toAppendTo.length();
+ auto initialLength = toAppendTo.length();
toAppendTo.append(event->getLoggerName());
- abbreviate(initialLength, toAppendTo);
+ if (initialLength < toAppendTo.length())
+ abbreviate(initialLength, toAppendTo);
}
diff --git a/src/main/cpp/nameabbreviator.cpp b/src/main/cpp/nameabbreviator.cpp
index 38c8ae90..caafce85 100644
--- a/src/main/cpp/nameabbreviator.cpp
+++ b/src/main/cpp/nameabbreviator.cpp
@@ -94,28 +94,22 @@ class MaxElementAbbreviator : public NameAbbreviator
}
/**
- * Abbreviate name.
- * @param buf buffer to append abbreviation.
- * @param nameStart start of name to abbreviate.
+ * {@inheritDoc}
*/
void abbreviate(LogString::size_type nameStart, LogString& buf)
const override
{
- // We substract 1 from 'len' when assigning to 'end' to
avoid out of
- // bounds exception in return r.substring(end+1, len).
This can happen if
- // precision is 1 and the logger name ends with a dot.
- LogString::size_type end = buf.length() - 1;
-
- for (LogString::size_type i = count; i > 0; i--)
+ logchar separ = 0x2E; // '.'
+ LogString::size_type end = buf.length();
+ for (LogString::size_type i = count; nameStart < end &&
0 < i; --i)
{
- end = buf.rfind(0x2E /* '.' */, end - 1);
-
- if ((end == LogString::npos) || (end <
nameStart))
+ end = buf.rfind(separ, end - 1);
+ if (LogString::npos == end)
{
return;
}
}
-
- buf.erase(buf.begin() + nameStart, buf.begin() + (end +
1));
+ if (nameStart < end + 1 && end + 1 < buf.length())
+ buf.erase(buf.begin() + nameStart, buf.begin()
+ (end + 1));
}
};
@@ -259,9 +253,7 @@ class PatternAbbreviator : public NameAbbreviator
}
/**
- * Abbreviate name.
- * @param buf buffer that abbreviated name is appended.
- * @param nameStart start of name.
+ * {@inheritDoc}
*/
void abbreviate(LogString::size_type nameStart, LogString& buf)
const override
{
@@ -279,7 +271,8 @@ class PatternAbbreviator : public NameAbbreviator
//
// apply the last pattern to all the remaining name
parts
//
- fragments.back().abbreviateAll(buf, pos);
+ if (pos < buf.length())
+ fragments.back().abbreviateAll(buf, pos);
}
};
}
diff --git a/src/main/include/log4cxx/pattern/nameabbreviator.h
b/src/main/include/log4cxx/pattern/nameabbreviator.h
index 70fa212c..0fb10c8f 100644
--- a/src/main/include/log4cxx/pattern/nameabbreviator.h
+++ b/src/main/include/log4cxx/pattern/nameabbreviator.h
@@ -70,10 +70,10 @@ class LOG4CXX_EXPORT NameAbbreviator : public
LOG4CXX_NS::helpers::Object
static NameAbbreviatorPtr getDefaultAbbreviator();
/**
- * Abbreviates a name in a StringBuffer.
- *
- * @param nameStart starting position of name in buf.
- * @param buf buffer, may not be null.
+ * Modify \c buf by abbreviating the name at index \c nameStart.
+ * @pre !buf.empty() && nameStart < buf.length()
+ * @param nameStart an index into \c buf of the name.
+ * @param buf string buffer containing name.
*/
virtual void abbreviate(LogString::size_type nameStart,
LogString& buf) const = 0;
diff --git a/src/main/include/log4cxx/pattern/namepatternconverter.h
b/src/main/include/log4cxx/pattern/namepatternconverter.h
index 87094362..397287b7 100644
--- a/src/main/include/log4cxx/pattern/namepatternconverter.h
+++ b/src/main/include/log4cxx/pattern/namepatternconverter.h
@@ -58,8 +58,9 @@ class LOG4CXX_EXPORT NamePatternConverter : public
LoggingEventPatternConverter
const std::vector<LogString>& options);
/**
- * Abbreviate name in string buffer.
- * @param nameStart starting position of name to abbreviate.
+ * Modify \c buf by abbreviating the name at index \c nameStart.
+ * @pre !buf.empty() && nameStart < buf.length()
+ * @param nameStart an index into \c buf of the name.
* @param buf string buffer containing name.
*/
void abbreviate(LogString::size_type nameStart, LogString& buf)
const;
diff --git a/src/test/cpp/patternlayouttest.cpp
b/src/test/cpp/patternlayouttest.cpp
index 0602660b..0c7f80db 100644
--- a/src/test/cpp/patternlayouttest.cpp
+++ b/src/test/cpp/patternlayouttest.cpp
@@ -95,6 +95,7 @@ LOGUNIT_CLASS(PatternLayoutTest)
LOGUNIT_TEST(testAbbreviateLeadingDot);
LOGUNIT_TEST(testAbbreviateTrailingDot);
LOGUNIT_TEST(testAbbreviateEmptyName);
+ LOGUNIT_TEST(testAbbreviateDegenerateName);
LOGUNIT_TEST(testAbbreviateSegmentEqualToCharCountBoundary);
LOGUNIT_TEST(testAbbreviateSegmentOneCharOverBoundary);
LOGUNIT_TEST(testAbbreviateManySegmentsDeepHierarchy);
@@ -780,16 +781,18 @@ public:
*/
void testAbbreviateTrailingDot()
{
- PatternLayout layout(LOG4CXX_STR("%c{1.}"));
auto event = std::make_shared<spi::LoggingEvent>
( LOG4CXX_STR("org.apache.")
, Level::getInfo()
, LOG4CXX_STR("msg")
, LOG4CXX_LOCATION
);
- LogString result;
- layout.format(result, event);
- LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("o.a.")), result);
+ LogString maxElementCharCountResult;
+
PatternLayout(LOG4CXX_STR("%c{1.}")).format(maxElementCharCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("o.a.")),
maxElementCharCountResult);
+ LogString maxElementCountResult;
+
PatternLayout(LOG4CXX_STR("%c{2}")).format(maxElementCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("apache.")),
maxElementCountResult);
}
/**
@@ -798,16 +801,37 @@ public:
*/
void testAbbreviateEmptyName()
{
- PatternLayout layout(LOG4CXX_STR("%c{2}"));
auto event = std::make_shared<spi::LoggingEvent>
( LOG4CXX_STR("")
, Level::getInfo()
, LOG4CXX_STR("msg")
, LOG4CXX_LOCATION
);
- LogString result;
- layout.format(result, event);
- LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("")), result);
+ LogString maxElementCountResult;
+
PatternLayout(LOG4CXX_STR("%c{2}")).format(maxElementCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("")),
maxElementCountResult);
+ LogString maxElementCharCountResult;
+
PatternLayout(LOG4CXX_STR("%c{1.}")).format(maxElementCharCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("")),
maxElementCharCountResult);
+ }
+
+ /**
+ * Degenerate logger name.
+ */
+ void testAbbreviateDegenerateName()
+ {
+ auto event = std::make_shared<spi::LoggingEvent>
+ ( LOG4CXX_STR(".")
+ , Level::getInfo()
+ , LOG4CXX_STR("msg")
+ , LOG4CXX_LOCATION
+ );
+ LogString maxElementCountResult;
+
PatternLayout(LOG4CXX_STR("%c{1}")).format(maxElementCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR(".")),
maxElementCountResult);
+ LogString maxElementCharCountResult;
+
PatternLayout(LOG4CXX_STR("%c{1.}")).format(maxElementCharCountResult, event);
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR(".")),
maxElementCharCountResult);
}
/**