diff options
Diffstat (limited to 'src/test/cpp/rolling/timebasedrollingtest.cpp')
-rwxr-xr-x | src/test/cpp/rolling/timebasedrollingtest.cpp | 442 |
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); |