Author: tschoening
Date: Tue Feb 18 13:56:35 2014
New Revision: 1569322

URL: http://svn.apache.org/r1569322
Log:
LOGCXX-425: I added a test for LOGCXX-420 which failed in the former codebase, 
additionally to the problem with the exceptions. The reason for the exceptions 
were negativ indices, the calculations for offsets in the magicString 
introduced in LOGCXX-420 were wrong because the magicString is always 3 chars 
only.

This and the failing added test for LOGCXX-420 has been fixed, but test 17 of 
cacheddateformattestcase.cpp is failing now. I will have a look into this 
afterwards.

Modified:
    incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp
    incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp

Modified: incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp?rev=1569322&r1=1569321&r2=1569322&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp Tue Feb 18 
13:56:35 2014
@@ -132,29 +132,32 @@ int CachedDateFormat::findMillisecondSta
            LogString plusZero;
            formatter->format(plusZero, slotBegin, pool);
 
-           // If the next 1..3 characters match the magic strings, depending 
on if the currently
+           // If the next 1..3 characters match the magic string, depending on 
if the currently
            // used millis overlap with the magic string, and the remaining 
fragments are identical.
+           // Because magic string and currently used millis can overlap, i is 
not always the index
+           // of the first millis char.
            //
            // LOG4CXX-420:
            // pattern:         %d{yyyy-MM-dd HH:mm:ss,SSS}
            // formatted:       2010-08-12 11:04:50,609
            // plusMagic:       2010-08-12 11:04:50,654
            // plusZero:                2010-08-12 11:04:50,000
+           int possibleRetVal = i - (3 - (formatted.length() - i));
            if (plusZero.length() == formatted.length()
-              && regionMatches(magicString, magicString.length() - 
(plusMagic.length() - i), plusMagic, i, plusMagic.length() - i)
-              && regionMatches(formattedMillis, formattedMillis.length() - 
(formatted.length() - i), formatted, i, formatted.length() - i)
-              && regionMatches(zeroString, 
(sizeof(zeroString)/sizeof(zeroString[0]) - 1) - (plusZero.length() - i), 
plusZero, i, plusZero.length() - i)
-              && (formatted.length() == i + (formatted.length() - i)
-                 || plusZero.compare(i + (plusZero.length() - i),
-                       LogString::npos, plusMagic, i + (plusMagic.length() - 
i), LogString::npos) == 0)) {
-              return i - (3 - (formatted.length() - i));
+              && regionMatches(magicString,            0, plusMagic,   
possibleRetVal, plusMagic.length()      - possibleRetVal)
+              && regionMatches(formattedMillis,        0, formatted,   
possibleRetVal, formatted.length()      - possibleRetVal)
+              && regionMatches(zeroString,             0, plusZero,    
possibleRetVal, plusZero.length()       - possibleRetVal)
+              && (formatted.length() == possibleRetVal + (formatted.length() - 
possibleRetVal)
+                 || plusZero.compare(possibleRetVal + (plusZero.length() - 
possibleRetVal),
+                       LogString::npos, plusMagic, possibleRetVal + 
(plusMagic.length() - possibleRetVal), LogString::npos) == 0)) {
+              return possibleRetVal;
            } else {
               return UNRECOGNIZED_MILLISECONDS;
           }
         }
      }
   }
-  return  NO_MILLISECONDS;
+  return NO_MILLISECONDS;
 }
 
 
@@ -237,7 +240,7 @@ int CachedDateFormat::findMillisecondSta
 void CachedDateFormat::millisecondFormat(int millis,
      LogString& buf,
      int offset) {
-     buf[offset] = digits[ millis / 100];
+     buf[offset] = digits[millis / 100];
      buf[offset + 1] = digits[(millis / 10) % 10];
      buf[offset + 2] = digits[millis  % 10];
  }

Modified: 
incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp?rev=1569322&r1=1569321&r2=1569322&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp 
(original)
+++ incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp 
Tue Feb 18 13:56:35 2014
@@ -49,7 +49,7 @@ using namespace log4cxx::pattern;
 
 /**
    Unit test {@link CachedDateFormat}.
-   
+
    */
 LOGUNIT_CLASS(CachedDateFormatTestCase)
    {
@@ -140,11 +140,11 @@ LOGUNIT_CLASS(CachedDateFormatTestCase)
      LogString actual;
      gmtFormat.format(actual, jul2, p);
      LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual);
-     
+
      actual.erase(actual.begin(), actual.end());
      chicagoFormat.format(actual, jul2, p);
      LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("19:00:00,000"), actual);
-     
+
      actual.erase(actual.begin(), actual.end());
      gmtFormat.format(actual, jul2, p);
      LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual);
@@ -450,17 +450,40 @@ void test11() {
  * Check pattern location for ISO8601
  */
 void test12() {
-   DateFormatPtr df = new SimpleDateFormat(LOG4CXX_STR("yyyy-MM-dd 
HH:mm:ss,SSS"));
-   apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY;
-
+   DateFormatPtr df    = new SimpleDateFormat(LOG4CXX_STR("yyyy-MM-dd 
HH:mm:ss,SSS"));
+   apr_time_t    ticks = 11142L * MICROSECONDS_PER_DAY;
    Pool p;
-
    LogString formatted;
+
    df->format(formatted, ticks, p);
+   int msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df, 
p);
+   LOGUNIT_ASSERT_EQUAL(20, msStart);
 
-   int millisecondStart = CachedDateFormat::findMillisecondStart(ticks,
-       formatted, df, p);
-   LOGUNIT_ASSERT_EQUAL(20, millisecondStart);
+   // Test for for milliseconds overlapping with the magic ones as per 
LOGCXX-420.
+   apr_time_exp_t c;
+   memset(&c, 0, sizeof(c));
+   c.tm_year = 110;
+   c.tm_mon  = 7;
+   c.tm_mday = 12;
+   c.tm_hour = 9;
+   c.tm_min  = 4;
+   c.tm_sec  = 50;
+   c.tm_usec = 406000;
+
+   LOGUNIT_ASSERT_EQUAL(0, apr_time_exp_gmt_get(&ticks, &c));
+
+   formatted.clear();
+   df->format(formatted, ticks, p);
+   int msStartLogcxx420_406 = CachedDateFormat::findMillisecondStart(ticks, 
formatted, df, p);
+   LOGUNIT_ASSERT_EQUAL(20, msStartLogcxx420_406);
+
+   c.tm_usec = 609000;
+   LOGUNIT_ASSERT_EQUAL(0, apr_time_exp_gmt_get(&ticks, &c));
+
+   formatted.clear();
+   df->format(formatted, ticks, p);
+   int msStartLogcxx420_609 = CachedDateFormat::findMillisecondStart(ticks, 
formatted, df, p);
+   LOGUNIT_ASSERT_EQUAL(20, msStartLogcxx420_609);
 }
 
 /**


Reply via email to