| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one or more | |
| * contributor license agreements. See the NOTICE file distributed with | |
| * this work for additional information regarding copyright ownership. | |
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |
| * (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include <log4cxx/helpers/cacheddateformat.h> | |
| #include "../logunit.h" | |
| #include <log4cxx/helpers/absolutetimedateformat.h> | |
| #include <log4cxx/helpers/iso8601dateformat.h> | |
| #include <log4cxx/helpers/relativetimedateformat.h> | |
| #include <log4cxx/helpers/pool.h> | |
| #include <locale> | |
| #include "../insertwide.h" | |
| #include <apr.h> | |
| #include <apr_time.h> | |
| #include "localechanger.h" | |
| using namespace log4cxx; | |
| using namespace log4cxx::helpers; | |
| using namespace log4cxx::pattern; | |
| #define LOCALE_US "C" | |
| #if defined(_WIN32) | |
| #define LOCALE_JP "Japanese_japan" | |
| #else | |
| #define LOCALE_JP "ja_JP" | |
| #endif | |
| //Define INT64_C for compilers that don't have it | |
| #if (!defined(INT64_C)) | |
| #define INT64_C(value) value ##LL | |
| #endif | |
| #define LOG4CXX_TEST 1 | |
| #include <log4cxx/private/log4cxx_private.h> | |
| /** | |
| * Unit test {@link CachedDateFormat}. | |
| */ | |
| LOGUNIT_CLASS(CachedDateFormatTestCase) | |
| { | |
| LOGUNIT_TEST_SUITE( CachedDateFormatTestCase ); | |
| LOGUNIT_TEST(test1); | |
| LOGUNIT_TEST(test2); | |
| LOGUNIT_TEST(test3); | |
| LOGUNIT_TEST(test4); | |
| #if LOG4CXX_HAS_STD_LOCALE | |
| LOGUNIT_TEST(test5); | |
| #endif | |
| 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(test22); | |
| LOGUNIT_TEST_SUITE_END(); | |
| #define MICROSECONDS_PER_DAY APR_INT64_C(86400000000) | |
| public: | |
| /** | |
| * Test multiple calls in close intervals. | |
| */ | |
| void test1() | |
| { | |
| // subsequent calls within one minute | |
| // are optimized to reuse previous formatted value | |
| // make a couple of nearly spaced calls | |
| DateFormatPtr baseFormatter(new AbsoluteTimeDateFormat()); | |
| CachedDateFormat gmtFormat(baseFormatter, 1000000); | |
| gmtFormat.setTimeZone(TimeZone::getGMT()); | |
| apr_time_t jul1 = MICROSECONDS_PER_DAY * 12601L; | |
| LogString actual; | |
| gmtFormat.format(actual, jul1); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, jul1 + 8000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,008"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, jul1 + 17000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,017"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, jul1 + 237000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,237"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, jul1 + 1415000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:01,415"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| } | |
| /** | |
| * Check for interaction between caches. | |
| */ | |
| void test2() | |
| { | |
| apr_time_t jul2 = MICROSECONDS_PER_DAY * 12602; | |
| DateFormatPtr baseFormatter(new AbsoluteTimeDateFormat()); | |
| CachedDateFormat gmtFormat(baseFormatter, 1000000); | |
| gmtFormat.setTimeZone(TimeZone::getGMT()); | |
| DateFormatPtr chicagoBase(new AbsoluteTimeDateFormat()); | |
| CachedDateFormat chicagoFormat(chicagoBase, 1000000); | |
| chicagoFormat.setTimeZone(TimeZone::getTimeZone(LOG4CXX_STR("GMT-5"))); | |
| LogString actual; | |
| gmtFormat.format(actual, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| chicagoFormat.format(actual, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("19:00:00,000"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual); | |
| } | |
| /** | |
| * Test multiple calls in close intervals prior to 1 Jan 1970. | |
| */ | |
| void test3() | |
| { | |
| // subsequent calls within one minute | |
| // are optimized to reuse previous formatted value | |
| // make a couple of nearly spaced calls | |
| DateFormatPtr baseFormatter(new AbsoluteTimeDateFormat()); | |
| CachedDateFormat gmtFormat(baseFormatter, 1000000); | |
| gmtFormat.setTimeZone(TimeZone::getGMT()); | |
| apr_time_t ticks = MICROSECONDS_PER_DAY * -7; | |
| LogString actual; | |
| gmtFormat.format(actual, ticks); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| // | |
| // APR's explode_time method does not properly calculate tm_usec | |
| // prior to 1 Jan 1970 on Unix | |
| gmtFormat.format(actual, ticks + 8000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,008"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, ticks + 17000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,017"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, ticks + 237000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,237"), actual); | |
| actual.erase(actual.begin(), actual.end()); | |
| gmtFormat.format(actual, ticks + 1423000); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:01,423"), actual); | |
| } | |
| void assertFormattedEquals( | |
| const DateFormatPtr & baseFormat, | |
| const CachedDateFormat & cachedFormat, | |
| apr_time_t date) | |
| { | |
| LogString expected; | |
| LogString actual; | |
| baseFormat->format(expected, date); | |
| cachedFormat.format(actual, date); | |
| LOGUNIT_ASSERT_EQUAL(expected, actual); | |
| } | |
| void test4() | |
| { | |
| // subsequent calls within one minute | |
| // are optimized to reuse previous formatted value | |
| // make a couple of nearly spaced calls | |
| #if LOG4CXX_HAS_STD_LOCALE | |
| std::locale loco(LOCALE_US); | |
| std::locale* localeEN = &loco; | |
| #else | |
| std::locale* localeEN = NULL; | |
| #endif | |
| DateFormatPtr baseFormat( | |
| new SimpleDateFormat(LOG4CXX_STR("EEE, MMM dd, HH:mm:ss.SSS Z"), localeEN)); | |
| CachedDateFormat cachedFormat(baseFormat, 1000000); | |
| // | |
| // use a date in 2000 to attempt to confuse the millisecond locator | |
| apr_time_t ticks = MICROSECONDS_PER_DAY * 11141; | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 8000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 17000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 237000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 1415000); | |
| } | |
| #if LOG4CXX_HAS_STD_LOCALE | |
| void test5() | |
| { | |
| // subsequent calls within one minute | |
| // are optimized to reuse previous formatted value | |
| // make a couple of nearly spaced calls | |
| LocaleChanger localeChange(LOCALE_JP); | |
| if (localeChange.isEffective()) | |
| { | |
| DateFormatPtr baseFormat(new SimpleDateFormat( | |
| LOG4CXX_STR("EEE, MMM dd, HH:mm:ss.SSS Z"))); | |
| CachedDateFormat cachedFormat(baseFormat, 1000000); | |
| // | |
| // use a date in 2000 to attempt to confuse the millisecond locator | |
| apr_time_t ticks = MICROSECONDS_PER_DAY * 11141; | |
| Pool p; | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 8000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 17000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 237000); | |
| assertFormattedEquals(baseFormat, cachedFormat, ticks + 1415000); | |
| } | |
| } | |
| #endif | |
| /** | |
| * Checks that numberFormat works as expected. | |
| */ | |
| void test6() | |
| { | |
| LogString numb; | |
| AbsoluteTimeDateFormat formatter; | |
| formatter.numberFormat(numb, 87); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("87"), numb); | |
| } | |
| /** | |
| * Set time zone on cached and check that it is effective. | |
| */ | |
| void test8() | |
| { | |
| DateFormatPtr baseFormat(new SimpleDateFormat(LOG4CXX_STR("yyyy-MM-dd HH:mm:ss,SSS"))); | |
| baseFormat->setTimeZone(TimeZone::getGMT()); | |
| CachedDateFormat cachedFormat(baseFormat, 1000000); | |
| apr_time_t jul4 = MICROSECONDS_PER_DAY * 12603; | |
| LogString actual; | |
| cachedFormat.format(actual, jul4); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("2004-07-04 00:00:00,000"), actual); | |
| cachedFormat.setTimeZone(TimeZone::getTimeZone(LOG4CXX_STR("GMT-6"))); | |
| actual.erase(actual.begin(), actual.end()); | |
| cachedFormat.format(actual, jul4); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("2004-07-03 18:00:00,000"), actual); | |
| } | |
| /** | |
| * Test of caching when less than three millisecond digits are specified. | |
| */ | |
| void test9() | |
| { | |
| std::locale localeUS(LOCALE_US); | |
| DateFormatPtr baseFormat = DateFormatPtr(new SimpleDateFormat( | |
| LOG4CXX_STR("yyyy-MMMM-dd HH:mm:ss,SS Z"), &localeUS)); | |
| DateFormatPtr cachedFormat = DateFormatPtr(new CachedDateFormat(baseFormat, 1000000)); | |
| TimeZonePtr cet = TimeZone::getTimeZone(LOG4CXX_STR("GMT+1")); | |
| cachedFormat->setTimeZone(cet); | |
| apr_time_exp_t c; | |
| memset(&c, 0, sizeof(c)); | |
| c.tm_year = 104; | |
| c.tm_mon = 11; | |
| c.tm_mday = 12; | |
| c.tm_hour = 19; | |
| c.tm_sec = 37; | |
| c.tm_usec = 23000; | |
| apr_time_t dec12; | |
| apr_status_t stat = apr_time_exp_gmt_get(&dec12, &c); | |
| const apr_status_t statOK = 0; | |
| LOGUNIT_ASSERT_EQUAL(statOK, stat); | |
| LogString s; | |
| cachedFormat->format(s, dec12); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("2004-December-12 20:00:37,23 +0100"), s); | |
| memset(&c, 0, sizeof(c)); | |
| c.tm_year = 104; | |
| c.tm_mon = 11; | |
| c.tm_mday = 31; | |
| c.tm_hour = 23; | |
| c.tm_sec = 13; | |
| c.tm_usec = 905000; | |
| apr_time_t jan1; | |
| stat = apr_time_exp_gmt_get(&jan1, &c); | |
| LOGUNIT_ASSERT_EQUAL(statOK, stat); | |
| s.erase(s.begin(), s.end()); | |
| cachedFormat->format(s, jan1); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("2005-January-01 00:00:13,905 +0100"), s); | |
| } | |
| /** | |
| * Test when millisecond position moves but length remains constant. | |
| */ | |
| void test10() | |
| { | |
| #if LOG4CXX_HAS_STD_LOCALE | |
| std::locale loco("C"); | |
| std::locale* localeUS = &loco; | |
| #else | |
| std::locale* localeUS = NULL; | |
| #endif | |
| DateFormatPtr baseFormat = DateFormatPtr(new SimpleDateFormat( | |
| LOG4CXX_STR("MMMM SSS EEEEEE"), localeUS)); | |
| DateFormatPtr cachedFormat = DateFormatPtr(new CachedDateFormat(baseFormat, 1000000)); | |
| TimeZonePtr cet = TimeZone::getTimeZone(LOG4CXX_STR("GMT+1")); | |
| cachedFormat->setTimeZone(cet); | |
| apr_time_exp_t c; | |
| memset(&c, 0, sizeof(c)); | |
| c.tm_year = 104; | |
| c.tm_mon = 9; | |
| c.tm_mday = 5; | |
| c.tm_hour = 21; | |
| c.tm_sec = 37; | |
| c.tm_usec = 23000; | |
| apr_time_t oct5; | |
| apr_status_t stat = apr_time_exp_gmt_get(&oct5, &c); | |
| const apr_status_t statOK = 0; | |
| LOGUNIT_ASSERT_EQUAL(statOK, stat); | |
| LogString s; | |
| cachedFormat->format(s, oct5); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("October 023 Tuesday"), s); | |
| memset(&c, 0, sizeof(c)); | |
| c.tm_year = 104; | |
| c.tm_mon = 10; | |
| c.tm_mday = 1; | |
| c.tm_usec = 23000; | |
| apr_time_t nov1; | |
| stat = apr_time_exp_gmt_get(&nov1, &c); | |
| LOGUNIT_ASSERT_EQUAL(statOK, stat); | |
| s.erase(s.begin(), s.end()); | |
| cachedFormat->format(s, nov1); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("November 023 Monday"), s); | |
| nov1 += 961000; | |
| s.erase(s.begin(), s.end()); | |
| cachedFormat->format(s, nov1); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("November 984 Monday"), s); | |
| } | |
| /** | |
| * Test that tests if caching is skipped if only "SS" | |
| * is specified. | |
| */ | |
| void test11() | |
| { | |
| // | |
| // Earlier versions could be tricked by "SS0" patterns. | |
| // | |
| LogString badPattern(LOG4CXX_STR("ss,SS0")); | |
| DateFormatPtr simpleFormat = DateFormatPtr(new SimpleDateFormat(badPattern)); | |
| DateFormatPtr gmtFormat = DateFormatPtr(new CachedDateFormat(simpleFormat, 1000000)); | |
| gmtFormat->setTimeZone(TimeZone::getGMT()); | |
| // | |
| // The first request has to 100 ms after an ordinal second | |
| // to push the literal zero out of the pattern check | |
| apr_time_t ticks = MICROSECONDS_PER_DAY * 11142L; | |
| apr_time_t jul2 = ticks + 120000; | |
| LogString s; | |
| gmtFormat->format(s, jul2); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("00,1200"), s); | |
| jul2 = ticks + 87000; | |
| s.erase(s.begin(), s.end()); | |
| gmtFormat->format(s, jul2); | |
| LOGUNIT_ASSERT_EQUAL( | |
| (LogString) LOG4CXX_STR("00,870"), s); | |
| } | |
| /** | |
| * Check pattern location for ISO8601 | |
| */ | |
| void test12() | |
| { | |
| DateFormatPtr df = DateFormatPtr(new SimpleDateFormat(LOG4CXX_STR("yyyy-MM-dd HH:mm:ss,SSS"))); | |
| apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY; | |
| LogString formatted; | |
| df->format(formatted, ticks); | |
| int msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df); | |
| LOGUNIT_ASSERT_EQUAL(20, msStart); | |
| // 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); | |
| msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df); | |
| 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); | |
| msStart = CachedDateFormat::findMillisecondStart(ticks, formatted, df); | |
| LOGUNIT_ASSERT_EQUAL(20, msStart); | |
| } | |
| /** | |
| * Check pattern location for DATE | |
| */ | |
| void test13() | |
| { | |
| DateFormatPtr df = DateFormatPtr(new SimpleDateFormat(LOG4CXX_STR("yyyy-MM-dd"))); | |
| apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY; | |
| LogString formatted; | |
| df->format(formatted, ticks); | |
| int millisecondStart = CachedDateFormat::findMillisecondStart(ticks, | |
| formatted, df); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::NO_MILLISECONDS, millisecondStart); | |
| } | |
| /** | |
| * Check pattern location for ABSOLUTE | |
| */ | |
| void test14() | |
| { | |
| DateFormatPtr df = DateFormatPtr(new SimpleDateFormat(LOG4CXX_STR("HH:mm:ss,SSS"))); | |
| apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY; | |
| LogString formatted; | |
| df->format(formatted, ticks); | |
| int millisecondStart = CachedDateFormat::findMillisecondStart(ticks, | |
| formatted, df); | |
| LOGUNIT_ASSERT_EQUAL(9, millisecondStart); | |
| } | |
| /** | |
| * Check pattern location for single S | |
| */ | |
| void test15() | |
| { | |
| DateFormatPtr df = DateFormatPtr(new SimpleDateFormat(LOG4CXX_STR("HH:mm:ss,S"))); | |
| apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY; | |
| LogString formatted; | |
| df->format(formatted, ticks); | |
| int millisecondStart = CachedDateFormat::findMillisecondStart(ticks, | |
| formatted, df); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, millisecondStart); | |
| } | |
| /** | |
| * Check pattern location for single SS | |
| */ | |
| void test16() | |
| { | |
| DateFormatPtr df = DateFormatPtr(new SimpleDateFormat(LOG4CXX_STR("HH:mm:ss,SS"))); | |
| apr_time_t ticks = 11142L * MICROSECONDS_PER_DAY; | |
| LogString formatted; | |
| df->format(formatted, ticks); | |
| int millisecondStart = | |
| CachedDateFormat::findMillisecondStart(ticks, formatted, df); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, millisecondStart); | |
| } | |
| /** | |
| * Check caching when multiple SSS appear in pattern | |
| */ | |
| void test17() | |
| { | |
| apr_time_t jul2 = 12602L * MICROSECONDS_PER_DAY; | |
| LogString badPattern(LOG4CXX_STR("HH:mm:ss,SSS HH:mm:ss,SSS")); | |
| DateFormatPtr simpleFormat = DateFormatPtr(new SimpleDateFormat(badPattern)); | |
| simpleFormat->setTimeZone(TimeZone::getGMT()); | |
| DateFormatPtr cachedFormat = DateFormatPtr(new CachedDateFormat(simpleFormat, 1000000)); | |
| LogString s; | |
| cachedFormat->format(s, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,000 00:00:00,000"), s); | |
| jul2 += 120000; | |
| s.erase(s.begin(), s.end()); | |
| simpleFormat->format(s, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,120 00:00:00,120"), s); | |
| s.erase(s.begin(), s.end()); | |
| int msStart = CachedDateFormat::findMillisecondStart(jul2, s, simpleFormat); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, msStart); | |
| cachedFormat->format(s, jul2); | |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("00:00:00,120 00:00:00,120"), s) ; | |
| 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; | |
| cachedFormat->format(s, jul2); | |
| msStart = CachedDateFormat::findMillisecondStart(jul2, s, simpleFormat); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, msStart); | |
| s.clear(); | |
| jul2 += 203000; | |
| cachedFormat->format(s, jul2); | |
| msStart = CachedDateFormat::findMillisecondStart(jul2, s, simpleFormat); | |
| LOGUNIT_ASSERT_EQUAL((int) CachedDateFormat::UNRECOGNIZED_MILLISECONDS, msStart); | |
| } | |
| /** | |
| * Check that patterns not containing microseconds | |
| * are reported as being able to be cached for a full second. | |
| */ | |
| void test18() | |
| { | |
| int maxValid = | |
| CachedDateFormat::getMaximumCacheValidity( | |
| LOG4CXX_STR("yyyy-MM-dd")); | |
| LOGUNIT_ASSERT_EQUAL(1000000, maxValid); | |
| } | |
| /** | |
| * Check that patterns not containing 3 microseconds | |
| * are reported as being able to be cached for a full second. | |
| */ | |
| void test19() | |
| { | |
| int maxValid = | |
| CachedDateFormat::getMaximumCacheValidity( | |
| LOG4CXX_STR("yyyy-MM-dd SSS")); | |
| LOGUNIT_ASSERT_EQUAL(1000000, maxValid); | |
| } | |
| /** | |
| * Check that patterns not containing 2 S's | |
| * are reported as being able to be cached for only a millisecond. | |
| */ | |
| void test20() | |
| { | |
| int maxValid = | |
| CachedDateFormat::getMaximumCacheValidity( | |
| LOG4CXX_STR("yyyy-MM-dd SS")); | |
| LOGUNIT_ASSERT_EQUAL(1000, maxValid); | |
| } | |
| /** | |
| * Check that patterns not containing multi S groups | |
| * are reported as being able to be cached for only a millisecond. | |
| */ | |
| void test21() | |
| { | |
| int maxValid = | |
| CachedDateFormat::getMaximumCacheValidity( | |
| LOG4CXX_STR("yyyy-MM-dd SSS SSS")); | |
| LOGUNIT_ASSERT_EQUAL(1000, maxValid); | |
| } | |
| /** | |
| * Check that findMillisecondStart correctly handles timestamps | |
| * which use the magic millisecond value 654. | |
| */ | |
| void test22() | |
| { | |
| DateFormatPtr baseFormatter(new ISO8601DateFormat()); | |
| CachedDateFormat isoFormat(baseFormatter, 1000000); | |
| isoFormat.setTimeZone(TimeZone::getGMT()); | |
| LogString formatted; | |
| isoFormat.format(formatted, 654000); | |
| LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("1970-01-01 00:00:00,654"), formatted); | |
| formatted.clear(); | |
| isoFormat.format(formatted, 999000); | |
| LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("1970-01-01 00:00:00,999"), formatted); | |
| formatted.clear(); | |
| isoFormat.format(formatted, 1654010); | |
| LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("1970-01-01 00:00:01,654"), formatted); | |
| formatted.clear(); | |
| isoFormat.format(formatted, 1999010); | |
| LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("1970-01-01 00:00:01,999"), formatted); | |
| } | |
| }; | |
| LOGUNIT_TEST_SUITE_REGISTRATION(CachedDateFormatTestCase); |