You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by ts...@apache.org on 2014/02/18 22:46:35 UTC

svn commit: r1569535 - in /incubator/log4cxx/trunk/src: main/cpp/cacheddateformat.cpp test/cpp/helpers/cacheddateformattestcase.cpp

Author: tschoening
Date: Tue Feb 18 21:46:35 2014
New Revision: 1569535

URL: http://svn.apache.org/r1569535
Log:
LOGCXX-425: Changed the calculation of millis in a formatted string again and added another tests for LOGCXX-420. There's some debug output in there which need to get removed later, but for now I need some help in defining the correct behavior and want others to be able to test themselves.

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=1569535&r1=1569534&r2=1569535&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/cacheddateformat.cpp Tue Feb 18 21:46:35 2014
@@ -132,24 +132,38 @@ int CachedDateFormat::findMillisecondSta
            LogString plusZero;
            formatter->format(plusZero, slotBegin, pool);
 
-           // 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));
+           // Test if the next 1..3 characters match the magic string, main problem is that magic
+           // available millis in formatted can overlap. Therefore the current i is not always the
+           // index of the first millis char, but may be already within the millis. Besides that
+           // the millis can occur everywhere in formatted. See LOGCXX-420 and following.
+           size_t	magicLength		= magicString.length();
+           size_t	overlapping		= magicString.find(plusMagic[i]);
+           int		possibleRetVal	= i - overlapping;
+
+wprintf(L"formatted: %s\n", formatted.c_str());
+wprintf(L"formattedMillis: %s\n", formattedMillis.c_str());
+wprintf(L"magicString: %s\n", magicString.c_str());
+wprintf(L"plusMagic: %s\n", plusMagic.c_str());
+wprintf(L"plusZero: %s\n", plusZero.c_str());
+
+printf("i: %i\n", i);
+printf("formatted.length(): %i\n", formatted.length());
+printf("overlapping: %i\n", overlapping);
+printf("possibleRetVal: %i\n", possibleRetVal);
+
+printf("1: %i\n", regionMatches(magicString, 0, plusMagic, possibleRetVal, magicLength));
+printf("2: %i\n", regionMatches(formattedMillis, 0, formatted, possibleRetVal, magicLength));
+printf("3: %i\n", regionMatches(zeroString, 0, plusZero, possibleRetVal, magicLength));
+printf("4: %i\n", formatted.length() == possibleRetVal + magicLength);
+printf("5: %i\n", plusZero.compare(possibleRetVal + magicLength, LogString::npos, plusMagic, possibleRetVal + magicLength, LogString::npos) == 0);
+
            if (plusZero.length() == formatted.length()
-              && 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)) {
+              && regionMatches(magicString,		0, plusMagic,	possibleRetVal, magicLength)
+              && regionMatches(formattedMillis,	0, formatted,	possibleRetVal, magicLength)
+              && regionMatches(zeroString,		0, plusZero,	possibleRetVal, magicLength)
+              /*&& (formatted.length() == possibleRetVal + magicLength
+                 || plusZero.compare(possibleRetVal + magicLength,
+                       LogString::npos, plusMagic, possibleRetVal + magicLength, LogString::npos) == 0)*/) {
               return possibleRetVal;
            } else {
               return UNRECOGNIZED_MILLISECONDS;
@@ -183,18 +197,16 @@ int CachedDateFormat::findMillisecondSta
   //     (that is if it was found or milliseconds did not appear)
   //
   if (millisecondStart != UNRECOGNIZED_MILLISECONDS) {
-
       //    Check if the cache is still valid.
       //    If the requested time is within the same integral second
       //       as the last request and a shorter expiration was not requested.
       if (now < slotBegin + expiration
           && now >= slotBegin
           && now < slotBegin + 1000000L) {
-
           //
           //    if there was a millisecond field then update it
           //
-          if (millisecondStart >= 0 ) {
+          if (millisecondStart >= 0) {
               millisecondFormat((int) ((now - slotBegin)/1000), cache, millisecondStart);
           }
           //
@@ -202,11 +214,11 @@ int CachedDateFormat::findMillisecondSta
           //      (the slot begin should be unchanged)
           previousTime = now;
           buf.append(cache);
+
           return;
       }
   }
 
-
   //
   //  could not use previous value.
   //    Call underlying formatter to format date.
@@ -219,7 +231,6 @@ int CachedDateFormat::findMillisecondSta
       slotBegin -= 1000000;
   }
 
-
   //
   //    if the milliseconds field was previous found
   //       then reevaluate in case it moved.
@@ -229,7 +240,6 @@ int CachedDateFormat::findMillisecondSta
   }
 }
 
-
 /**
  *   Formats a count of milliseconds (0-999) into a numeric representation.
  *   @param millis Millisecond count between 0 and 999.

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=1569535&r1=1569534&r2=1569535&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp (original)
+++ incubator/log4cxx/trunk/src/test/cpp/helpers/cacheddateformattestcase.cpp Tue Feb 18 21:46:35 2014
@@ -48,38 +48,36 @@ using namespace log4cxx::pattern;
 
 
 /**
-   Unit test {@link CachedDateFormat}.
-
-   */
+ * Unit test {@link CachedDateFormat}.
+ */
 LOGUNIT_CLASS(CachedDateFormatTestCase)
    {
      LOGUNIT_TEST_SUITE( CachedDateFormatTestCase );
-     LOGUNIT_TEST( test1 );
-     LOGUNIT_TEST( test2 );
-     LOGUNIT_TEST( test3 );
-     LOGUNIT_TEST( test4 );
+     LOGUNIT_TEST(test1);
+     LOGUNIT_TEST(test2);
+     LOGUNIT_TEST(test3);
+     LOGUNIT_TEST(test4);
 #if LOG4CXX_HAS_STD_LOCALE
-     LOGUNIT_TEST( test5 );
+     LOGUNIT_TEST(test5);
 #endif
-     LOGUNIT_TEST( test6 );
-     LOGUNIT_TEST( test8 );
+     LOGUNIT_TEST(test6);
+     LOGUNIT_TEST(test8);
 //   Gump doesn't like this test
-//     LOGUNIT_TEST( test9 );
-     LOGUNIT_TEST( test10 );
-     LOGUNIT_TEST( test11);
-     LOGUNIT_TEST( test12 );
-     LOGUNIT_TEST( test13 );
-     LOGUNIT_TEST( test14 );
-     LOGUNIT_TEST( test15 );
-     LOGUNIT_TEST( test16 );
-     LOGUNIT_TEST( test17);
-     LOGUNIT_TEST( test18);
-     LOGUNIT_TEST( test19);
-     LOGUNIT_TEST( test20);
-     LOGUNIT_TEST( test21);
+//     LOGUNIT_TEST(test9);
+     LOGUNIT_TEST(test10);
+     LOGUNIT_TEST(test11);
+     LOGUNIT_TEST(test12);
+     LOGUNIT_TEST(test13);
+     LOGUNIT_TEST(test14);
+     LOGUNIT_TEST(test15);
+     LOGUNIT_TEST(test16);
+     LOGUNIT_TEST(test17);
+     LOGUNIT_TEST(test18);
+     LOGUNIT_TEST(test19);
+     LOGUNIT_TEST(test20);
+     LOGUNIT_TEST(test21);
      LOGUNIT_TEST_SUITE_END();
 
-
 #define MICROSECONDS_PER_DAY APR_INT64_C(86400000000)
 
    public:
@@ -474,16 +472,16 @@ void test12() {
 
    formatted.clear();
    df->format(formatted, ticks, p);
-   int msStartLogcxx420_406 = CachedDateFormat::findMillisecondStart(ticks, formatted, df, p);
-   LOGUNIT_ASSERT_EQUAL(20, msStartLogcxx420_406);
+   msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df, p);
+   LOGUNIT_ASSERT_EQUAL(20, msStart);
 
    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);
+   msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df, p);
+   LOGUNIT_ASSERT_EQUAL(20, msStart);
 }
 
 /**
@@ -551,7 +549,6 @@ void test16() {
    LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, millisecondStart);
 }
 
-
 /**
  * Check caching when multiple SSS appear in pattern
  */
@@ -574,12 +571,30 @@ void test17() {
     LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,120 00:00:00,120"), s);
 
     s.erase(s.begin(), s.end());
+printf("test17 1\n");
     cachedFormat->format(s, jul2, p);
-
     LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,120 00:00:00,120"), s) ;
+printf("test17 2\n");
 
     int maxValid = CachedDateFormat::getMaximumCacheValidity(badPattern);
     LOGUNIT_ASSERT_EQUAL(1000, maxValid);
+
+    // Test overlapping millis with a magic string from CachedDateFormat for LOGCXX-420.
+    s.clear();
+    jul2 += 286000;
+printf("test17 3\n");
+    cachedFormat->format(s, jul2, p);
+    int msStart = CachedDateFormat::findMillisecondStart(jul2, s, simpleFormat, p);
+    LOGUNIT_ASSERT_EQUAL(9, msStart);
+printf("test17 4\n");
+
+    s.clear();
+    jul2 += 203000;
+printf("test17 5\n");
+    cachedFormat->format(s, jul2, p);
+    msStart = CachedDateFormat::findMillisecondStart(jul2, s, simpleFormat, p);
+    LOGUNIT_ASSERT_EQUAL(9, msStart);
+printf("test17 6\n");
 }
 
 /**
@@ -632,5 +647,4 @@ void test21() {
 
 };
 
-
 LOGUNIT_TEST_SUITE_REGISTRATION(CachedDateFormatTestCase);