blob: d88b0a5c20978fce36b3a3f8adf88c7b378b104c [file] [log] [blame]
/*
* 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 "../logunit.h"
#include <log4cxx/logstring.h>
#include <log4cxx/helpers/absolutetimedateformat.h>
#include "../insertwide.h"
#include <apr.h>
#include <apr_time.h>
#include <log4cxx/helpers/pool.h>
//Define INT64_C for compilers that don't have it
#if (!defined(INT64_C))
#define INT64_C(value) value ## LL
#endif
using namespace log4cxx;
using namespace log4cxx::helpers;
/**
Unit test {@link AbsoluteTimeDateFormat}.
*/
LOGUNIT_CLASS(AbsoluteTimeDateFormatTestCase)
{
LOGUNIT_TEST_SUITE(AbsoluteTimeDateFormatTestCase);
LOGUNIT_TEST(test1);
LOGUNIT_TEST(test2);
LOGUNIT_TEST(test3);
LOGUNIT_TEST(test4);
LOGUNIT_TEST(test5);
LOGUNIT_TEST(test6);
LOGUNIT_TEST(test7);
LOGUNIT_TEST(test8);
LOGUNIT_TEST_SUITE_END();
public:
/**
* Asserts that formatting the provided date results
* in the expected string.
*
* @param date Date date
* @param timeZone TimeZone timezone for conversion
* @param expected String expected string
*/
private:
void assertFormattedTime(apr_time_t date,
const TimeZonePtr & timeZone,
const LogString & expected)
{
AbsoluteTimeDateFormat formatter;
formatter.setTimeZone(timeZone);
LogString actual;
Pool p;
formatter.format(actual, date, p);
LOGUNIT_ASSERT_EQUAL(expected, actual);
}
#define MICROSECONDS_PER_DAY APR_INT64_C(86400000000)
public:
/**
* Convert 02 Jan 2004 00:00:00 GMT for GMT.
*/
void test1()
{
//
// 02 Jan 2004 00:00 GMT
//
apr_time_t jan2 = MICROSECONDS_PER_DAY * 12419;
assertFormattedTime(jan2, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,000"));
}
/**
* Convert 03 Jan 2004 00:00:00 GMT for America/Chicago.
*/
void test2()
{
//
// 03 Jan 2004 00:00 GMT
// (asking for the same time at a different timezone
// will ignore the change of timezone)
apr_time_t jan2 = MICROSECONDS_PER_DAY * 12420;
assertFormattedTime(jan2, TimeZone::getTimeZone(LOG4CXX_STR("GMT-6")), LOG4CXX_STR("18:00:00,000"));
}
/**
* Convert 29 Jun 2004 00:00:00 GMT for GMT.
*/
void test3()
{
apr_time_t jun29 = MICROSECONDS_PER_DAY * 12599;
assertFormattedTime(jun29, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,000"));
}
/**
* Convert 29 Jun 2004 00:00:00 GMT for Chicago, daylight savings in effect.
*/
void test4()
{
apr_time_t jun30 = MICROSECONDS_PER_DAY * 12600;
//
// log4cxx doesn't support non-fixed timezones at this time
// passing the fixed equivalent to Chicago's Daylight Savings Time
//
assertFormattedTime(jun30, TimeZone::getTimeZone(LOG4CXX_STR("GMT-5")), LOG4CXX_STR("19:00:00,000"));
}
/**
* Test multiple calls in close intervals.
*/
void test5()
{
// subsequent calls within one minute
// are optimized to reuse previous formatted value
// make a couple of nearly spaced calls
apr_time_t ticks = MICROSECONDS_PER_DAY * 12601;
assertFormattedTime(ticks, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,000"));
assertFormattedTime(ticks + 8000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,008"));
assertFormattedTime(ticks + 17000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,017"));
assertFormattedTime(ticks + 237000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,237"));
assertFormattedTime(ticks + 1415000, TimeZone::getGMT(), LOG4CXX_STR("00:00:01,415"));
}
/**
* Check that caching does not disregard timezone.
* This test would fail for revision 1.4 of AbsoluteTimeDateFormat.java.
*/
void test6()
{
apr_time_t jul2 = MICROSECONDS_PER_DAY * 12602;
assertFormattedTime(jul2, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,000"));
assertFormattedTime(jul2, TimeZone::getTimeZone(LOG4CXX_STR("GMT-5")), LOG4CXX_STR("19:00:00,000"));
}
/**
* Test multiple calls in close intervals predating 1 Jan 1970.
*/
void test7()
{
// subsequent calls within one minute
// are optimized to reuse previous formatted value
// make a couple of nearly spaced calls
apr_time_t ticks = MICROSECONDS_PER_DAY * -7;
assertFormattedTime(ticks, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,000"));
#if defined(_WIN32)
//
// These tests fail on Unix due to bug in APR's explode_time
//
// assertFormattedTime(ticks + 8000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,008"));
// assertFormattedTime(ticks + 17000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,017"));
// assertFormattedTime(ticks + 237000, TimeZone::getGMT(), LOG4CXX_STR("00:00:00,237"));
// assertFormattedTime(ticks + 1415000, TimeZone::getGMT(), LOG4CXX_STR("00:00:01,415"));
#endif
}
/**
* Checks that numberFormat works as expected.
*/
void test8()
{
Pool p;
LogString numb;
AbsoluteTimeDateFormat formatter;
formatter.numberFormat(numb, 87, p);
LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("87"), numb);
}
};
LOGUNIT_TEST_SUITE_REGISTRATION(AbsoluteTimeDateFormatTestCase);