This is an automated email from the ASF dual-hosted git repository. swebb2066 pushed a commit to branch add_more_name_abreviation_tests in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit 49aacfd55007808e2b194fdcddfe3811fc1626bf Author: Stephen Webb <[email protected]> AuthorDate: Mon Aug 31 16:06:34 2026 +1000 Add some more name abbreviation test cases --- 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); } /**
