blob: 3114e2c40653a055ca8fdcf3cbbd8b29685c5259 [file]
/*
* 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/rolling/rollingfileappender.h>
#include <log4cxx/logger.h>
#include <log4cxx/consoleappender.h>
#include <log4cxx/logmanager.h>
#include <log4cxx/patternlayout.h>
#include <log4cxx/rolling/timebasedrollingpolicy.h>
#include <log4cxx/helpers/simpledateformat.h>
#include <iostream>
#include <log4cxx/helpers/stringhelper.h>
#include "../util/compare.h"
#include "../logunit.h"
#include <apr_strings.h>
#ifndef INT64_C
#define INT64_C(x) x ## LL
#endif
#include <apr_time.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::rolling;
/**
* A rather exhaustive set of tests. Tests include leaving the ActiveFileName
* argument blank, or setting it, with and without compression, and tests
* with or without stopping/restarting the RollingFileAppender.
*
* The regression tests log a few times using a RollingFileAppender. Then,
* they predict the names of the files which sould be generated and compare
* them with witness files.
*
* <pre>
Compression ActiveFileName Stop/Restart
Test1 NO BLANK NO
Test2 NO BLANK YES
Test3 YES BLANK NO
Test4 NO SET YES
Test5 NO SET NO
Test6 YES SET NO
* </pre>
*
*/
LOGUNIT_CLASS(TimeBasedRollingTest) {
LOGUNIT_TEST_SUITE(TimeBasedRollingTest);
LOGUNIT_TEST(test1);
LOGUNIT_TEST(test2);
LOGUNIT_TEST(test3);
LOGUNIT_TEST(test4);
LOGUNIT_TEST(test5);
LOGUNIT_TEST(test6);
LOGUNIT_TEST_SUITE_END();
static LoggerPtr logger;
public:
void setUp() {
LoggerPtr root(Logger::getRootLogger());
root->addAppender(
new ConsoleAppender(new PatternLayout(
LOG4CXX_STR("%d{ABSOLUTE} [%t] %level %c{2}#%M:%L - %m%n"))));
}
void tearDown() {
LogManager::shutdown();
}
/**
* Test rolling without compression, activeFileName left blank, no stop/start
*/
void test1() {
PatternLayoutPtr layout(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")));
RollingFileAppenderPtr rfa(new RollingFileAppender());
rfa->setLayout(layout);
LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"));
TimeBasedRollingPolicyPtr tbrp(new TimeBasedRollingPolicy());
tbrp->setFileNamePattern(LOG4CXX_STR("output/test1-%d{yyyy-MM-dd_HH_mm_ss}"));
Pool p;
tbrp->activateOptions(p);
rfa->setRollingPolicy(tbrp);
rfa->activateOptions(p);
logger->addAppender(rfa);
SimpleDateFormat sdf(datePattern);
LogString filenames[4];
Pool pool;
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 4; i++) {
filenames[i] = LOG4CXX_STR("output/test1-");
sdf.format(filenames[i], now, p);
now += APR_USEC_PER_SEC;
} }
std::cout << "Waiting until next second and 100 millis.";
delayUntilNextSecond(100);
std::cout << "Done waiting.";
{ for (int i = 0; i < 5; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
for (int i = 0; i < 4; i++) {
LogString witness(LOG4CXX_STR("witness/rolling/tbr-test1."));
StringHelper::toString(i, pool, witness);
LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness)));
}
}
/**
* No compression, with stop/restart, activeFileName left blank
*/
void test2() {
LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"));
PatternLayoutPtr layout1(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")));
RollingFileAppenderPtr rfa1(new RollingFileAppender());
rfa1->setLayout(layout1);
TimeBasedRollingPolicyPtr tbrp1(new TimeBasedRollingPolicy());
tbrp1->setFileNamePattern(LOG4CXX_STR("output/test2-%d{yyyy-MM-dd_HH_mm_ss}"));
Pool pool;
tbrp1->activateOptions(pool);
rfa1->setRollingPolicy(tbrp1);
rfa1->activateOptions(pool);
logger->addAppender(rfa1);
SimpleDateFormat sdf(datePattern);
LogString filenames[4];
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 4; i++) {
filenames[i] = LOG4CXX_STR("output/test2-");
sdf.format(filenames[i], now, pool);
now += APR_USEC_PER_SEC;
} }
delayUntilNextSecond(100);
{ for (int i = 0; i <= 2; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
logger->removeAppender(rfa1);
rfa1->close();
PatternLayoutPtr layout2(new PatternLayout(LOG4CXX_STR("%c{1} - %m%n")));
RollingFileAppenderPtr rfa2 = new RollingFileAppender();
rfa2->setLayout(layout2);
TimeBasedRollingPolicyPtr tbrp2 = new TimeBasedRollingPolicy();
tbrp2->setFileNamePattern(LOG4CXX_STR("output/test2-%d{yyyy-MM-dd_HH_mm_ss}"));
tbrp2->activateOptions(pool);
rfa2->setRollingPolicy(tbrp2);
rfa2->activateOptions(pool);
logger->addAppender(rfa2);
{ for (int i = 3; i <= 4; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
for (int i = 0; i < 4; i++) {
LogString witness(LOG4CXX_STR("witness/rolling/tbr-test2."));
StringHelper::toString(i, pool, witness);
LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness)));
}
}
/**
* With compression, activeFileName left blank, no stop/restart
*/
void test3() {
Pool p;
PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"));
RollingFileAppenderPtr rfa = new RollingFileAppender();
rfa->setAppend(false);
rfa->setLayout(layout);
LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss");
TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy();
tbrp->setFileNamePattern(LogString(LOG4CXX_STR("output/test3-%d{")) + datePattern + LogString(LOG4CXX_STR("}.gz")));
tbrp->activateOptions(p);
rfa->setRollingPolicy(tbrp);
rfa->activateOptions(p);
logger->addAppender(rfa);
DateFormatPtr sdf = new SimpleDateFormat(datePattern);
LogString filenames[4];
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 4; i++) {
filenames[i] = LOG4CXX_STR("output/test3-");
sdf->format(filenames[i], now, p);
filenames[i].append(LOG4CXX_STR(".gz"));
now += APR_USEC_PER_SEC;
} }
filenames[3].resize(filenames[3].size() - 3);
delayUntilNextSecond(100);
{ for (int i = 0; i < 5; i++) {
std::string message("Hello---");
message.append(p.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
LOGUNIT_ASSERT_EQUAL(true, File(filenames[0]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, File(filenames[1]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, File(filenames[2]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, Compare::compare(File(filenames[3]), File(LOG4CXX_STR("witness/rolling/tbr-test3.3"))));
}
/**
* Without compression, activeFileName set, with stop/restart
*/
void test4() {
LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss");
PatternLayoutPtr layout1 = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"));
RollingFileAppenderPtr rfa1 = new RollingFileAppender();
rfa1->setLayout(layout1);
Pool pool;
TimeBasedRollingPolicyPtr tbrp1 = new TimeBasedRollingPolicy();
rfa1->setFile(LOG4CXX_STR("output/test4.log"));
tbrp1->setFileNamePattern(LOG4CXX_STR("output/test4-%d{yyyy-MM-dd_HH_mm_ss}"));
tbrp1->activateOptions(pool);
rfa1->setRollingPolicy(tbrp1);
rfa1->activateOptions(pool);
logger->addAppender(rfa1);
SimpleDateFormat sdf(datePattern);
LogString filenames[4];
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 3; i++) {
filenames[i] = LOG4CXX_STR("output/test4-");
sdf.format(filenames[i], now, pool);
now += APR_USEC_PER_SEC;
} }
filenames[3] = LOG4CXX_STR("output/test4.log");
std::cout << "Waiting until next second and 100 millis.";
delayUntilNextSecond(100);
std::cout << "Done waiting.";
{ for (int i = 0; i <= 2; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
logger->removeAppender(rfa1);
rfa1->close();
PatternLayoutPtr layout2 = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"));
RollingFileAppenderPtr rfa2 = new RollingFileAppender();
rfa2->setLayout(layout2);
TimeBasedRollingPolicyPtr tbrp2 = new TimeBasedRollingPolicy();
tbrp2->setFileNamePattern(LOG4CXX_STR("output/test4-%d{yyyy-MM-dd_HH_mm_ss}"));
rfa2->setFile(LOG4CXX_STR("output/test4.log"));
tbrp2->activateOptions(pool);
rfa2->setRollingPolicy(tbrp2);
rfa2->activateOptions(pool);
logger->addAppender(rfa2);
{ for (int i = 3; i <= 4; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
for (int i = 0; i < 4; i++) {
LogString witness(LOG4CXX_STR("witness/rolling/tbr-test4."));
StringHelper::toString(i, pool, witness);
LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness)));
}
}
/**
* No compression, activeFileName set, without stop/restart
*/
void test5() {
PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"));
RollingFileAppenderPtr rfa = new RollingFileAppender();
rfa->setLayout(layout);
LogString datePattern(LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss"));
TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy();
tbrp->setFileNamePattern(LOG4CXX_STR("output/test5-%d{yyyy-MM-dd_HH_mm_ss}"));
rfa->setFile(LOG4CXX_STR("output/test5.log"));
Pool pool;
tbrp->activateOptions(pool);
rfa->setRollingPolicy(tbrp);
rfa->activateOptions(pool);
logger->addAppender(rfa);
SimpleDateFormat sdf(datePattern);
LogString filenames[4];
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 3; i++) {
filenames[i] = LOG4CXX_STR("output/test5-");
sdf.format(filenames[i], now, pool);
now += APR_USEC_PER_SEC;
} }
filenames[3] = LOG4CXX_STR("output/test5.log");
std::cout << "Waiting until next second and 100 millis.";
delayUntilNextSecond(100);
std::cout << "Done waiting.";
{ for (int i = 0; i < 5; i++) {
std::string message("Hello---");
message.append(pool.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
for (int i = 0; i < 4; i++) {
LogString witness(LOG4CXX_STR("witness/rolling/tbr-test5."));
StringHelper::toString(i, pool, witness);
LOGUNIT_ASSERT(Compare::compare(filenames[i], File(witness)));
}
}
/**
* With compression, activeFileName set, no stop/restart,
*/
void test6() {
Pool p;
PatternLayoutPtr layout = new PatternLayout(LOG4CXX_STR("%c{1} - %m%n"));
RollingFileAppenderPtr rfa = new RollingFileAppender();
rfa->setAppend(false);
rfa->setLayout(layout);
LogString datePattern = LOG4CXX_STR("yyyy-MM-dd_HH_mm_ss");
TimeBasedRollingPolicyPtr tbrp = new TimeBasedRollingPolicy();
tbrp->setFileNamePattern(LogString(LOG4CXX_STR("output/test6-%d{")) + datePattern + LogString(LOG4CXX_STR("}.gz")));
rfa->setFile(LOG4CXX_STR("output/test6.log"));
tbrp->activateOptions(p);
rfa->setRollingPolicy(tbrp);
rfa->activateOptions(p);
logger->addAppender(rfa);
DateFormatPtr sdf = new SimpleDateFormat(datePattern);
LogString filenames[4];
apr_time_t now = apr_time_now();
{ for (int i = 0; i < 3; i++) {
filenames[i] = LOG4CXX_STR("output/test6-");
sdf->format(filenames[i], now, p);
filenames[i].append(LOG4CXX_STR(".gz"));
now += APR_USEC_PER_SEC;
} }
filenames[3] = LOG4CXX_STR("output/test6.log");
delayUntilNextSecond(100);
{ for (int i = 0; i < 5; i++) {
std::string message("Hello---");
message.append(p.itoa(i));
LOG4CXX_DEBUG(logger, message);
apr_sleep(APR_USEC_PER_SEC/2);
} }
LOGUNIT_ASSERT_EQUAL(true, File(filenames[0]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, File(filenames[1]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, File(filenames[2]).exists(p));
LOGUNIT_ASSERT_EQUAL(true, Compare::compare(File(filenames[3]), File(LOG4CXX_STR("witness/rolling/tbr-test6.3"))));
}
void delayUntilNextSecond(int millis) {
apr_time_t now = apr_time_now();
apr_time_t next = ((now / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC
+ millis * 1000L;
apr_sleep(next - now);
}
void delayUntilNextMinute(int seconds) {
apr_time_t now = apr_time_now();
apr_time_t next = ((now / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC
+ seconds * 1000000L;
apr_sleep(next - now);
}
};
LoggerPtr TimeBasedRollingTest::logger(Logger::getLogger("org.apache.log4j.TimeBasedRollingTest"));
LOGUNIT_TEST_SUITE_REGISTRATION(TimeBasedRollingTest);