summaryrefslogtreecommitdiff
path: root/src/test/cpp/rolling/timebasedrollingtest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/cpp/rolling/timebasedrollingtest.cpp')
-rwxr-xr-xsrc/test/cpp/rolling/timebasedrollingtest.cpp442
1 files changed, 442 insertions, 0 deletions
diff --git a/src/test/cpp/rolling/timebasedrollingtest.cpp b/src/test/cpp/rolling/timebasedrollingtest.cpp
new file mode 100755
index 0000000..3114e2c
--- /dev/null
+++ b/src/test/cpp/rolling/timebasedrollingtest.cpp
@@ -0,0 +1,442 @@
+/*
+ * 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);