blob: e36886df39e1acf494d9385f1c5353fb6423334e [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 <log4cxx/logger.h>
#include <log4cxx/fileappender.h>
#include <log4cxx/appenderskeleton.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/logmanager.h>
#include <log4cxx/level.h>
#include <log4cxx/hierarchy.h>
#include <log4cxx/spi/rootlogger.h>
#include <log4cxx/helpers/propertyresourcebundle.h>
#include "insertwide.h"
#include "testchar.h"
#include "logunit.h"
#include <log4cxx/helpers/locale.h>
#include "vectorappender.h"
using namespace log4cxx;
using namespace log4cxx::spi;
using namespace log4cxx::helpers;
class CountingAppender;
typedef helpers::ObjectPtrT<CountingAppender> CountingAppenderPtr;
class CountingAppender : public AppenderSkeleton
{
public:
int counter;
CountingAppender() : counter(0)
{}
void close()
{}
void append(const spi::LoggingEventPtr& /*event*/, Pool& /*p*/)
{
counter++;
}
bool requiresLayout() const
{
return true;
}
};
LOGUNIT_CLASS(LoggerTestCase)
{
LOGUNIT_TEST_SUITE(LoggerTestCase);
LOGUNIT_TEST(testAppender1);
LOGUNIT_TEST(testAppender2);
LOGUNIT_TEST(testAdditivity1);
LOGUNIT_TEST(testAdditivity2);
LOGUNIT_TEST(testAdditivity3);
LOGUNIT_TEST(testDisable1);
// LOGUNIT_TEST(testRB1);
// LOGUNIT_TEST(testRB2); //TODO restore
// LOGUNIT_TEST(testRB3);
LOGUNIT_TEST(testExists);
LOGUNIT_TEST(testHierarchy1);
LOGUNIT_TEST(testTrace);
LOGUNIT_TEST(testIsTraceEnabled);
LOGUNIT_TEST_SUITE_END();
public:
void setUp()
{
}
void tearDown()
{
BasicConfigurator::resetConfiguration();
a1 = 0;
a2 = 0;
logger = 0;
}
/**
Add an appender and see if it can be retrieved.
*/
void testAppender1()
{
logger = Logger::getLogger(LOG4CXX_TEST_STR("test"));
a1 = new FileAppender();
a1->setName(LOG4CXX_STR("testAppender1"));
logger->addAppender(a1);
AppenderList list = logger->getAllAppenders();
AppenderPtr aHat = list.front();
LOGUNIT_ASSERT_EQUAL(a1, aHat);
}
/**
Add an appender X, Y, remove X and check if Y is the only
remaining appender.
*/
void testAppender2()
{
a1 = new FileAppender();
a1->setName(LOG4CXX_STR("testAppender2.1"));
a2 = new FileAppender();
a2->setName(LOG4CXX_STR("testAppender2.2"));
logger = Logger::getLogger(LOG4CXX_TEST_STR("test"));
logger->addAppender(a1);
logger->addAppender(a2);
logger->removeAppender((LogString) LOG4CXX_STR("testAppender2.1"));
AppenderList list = logger->getAllAppenders();
AppenderPtr aHat = list.front();
LOGUNIT_ASSERT_EQUAL(a2, aHat);
LOGUNIT_ASSERT(list.size() == 1);
}
/**
Test if LoggerPtr a.b inherits its appender from a.
*/
void testAdditivity1()
{
LoggerPtr a = Logger::getLogger(LOG4CXX_TEST_STR("a"));
LoggerPtr ab = Logger::getLogger(LOG4CXX_TEST_STR("a.b"));
CountingAppenderPtr ca = new CountingAppender();
a->addAppender(ca);
LOGUNIT_ASSERT_EQUAL(ca->counter, 0);
ab->debug(MSG);
LOGUNIT_ASSERT_EQUAL(ca->counter, 1);
ab->info(MSG);
LOGUNIT_ASSERT_EQUAL(ca->counter, 2);
ab->warn(MSG);
LOGUNIT_ASSERT_EQUAL(ca->counter, 3);
ab->error(MSG);
LOGUNIT_ASSERT_EQUAL(ca->counter, 4);
}
/**
Test multiple additivity.
*/
void testAdditivity2()
{
LoggerPtr a = Logger::getLogger(LOG4CXX_TEST_STR("a"));
LoggerPtr ab = Logger::getLogger(LOG4CXX_TEST_STR("a.b"));
LoggerPtr abc = Logger::getLogger(LOG4CXX_TEST_STR("a.b.c"));
LoggerPtr x = Logger::getLogger(LOG4CXX_TEST_STR("x"));
CountingAppenderPtr ca1 = new CountingAppender();
CountingAppenderPtr ca2 = new CountingAppender();
a->addAppender(ca1);
abc->addAppender(ca2);
LOGUNIT_ASSERT_EQUAL(ca1->counter, 0);
LOGUNIT_ASSERT_EQUAL(ca2->counter, 0);
ab->debug(MSG);
LOGUNIT_ASSERT_EQUAL(ca1->counter, 1);
LOGUNIT_ASSERT_EQUAL(ca2->counter, 0);
abc->debug(MSG);
LOGUNIT_ASSERT_EQUAL(ca1->counter, 2);
LOGUNIT_ASSERT_EQUAL(ca2->counter, 1);
x->debug(MSG);
LOGUNIT_ASSERT_EQUAL(ca1->counter, 2);
LOGUNIT_ASSERT_EQUAL(ca2->counter, 1);
}
/**
Test additivity flag.
*/
void testAdditivity3()
{
LoggerPtr root = Logger::getRootLogger();
LoggerPtr a = Logger::getLogger(LOG4CXX_TEST_STR("a"));
LoggerPtr ab = Logger::getLogger(LOG4CXX_TEST_STR("a.b"));
LoggerPtr abc = Logger::getLogger(LOG4CXX_TEST_STR("a.b.c"));
LoggerPtr x = Logger::getLogger(LOG4CXX_TEST_STR("x"));
CountingAppenderPtr caRoot = new CountingAppender();
CountingAppenderPtr caA = new CountingAppender();
CountingAppenderPtr caABC = new CountingAppender();
root->addAppender(caRoot);
a->addAppender(caA);
abc->addAppender(caABC);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 0);
LOGUNIT_ASSERT_EQUAL(caA->counter, 0);
LOGUNIT_ASSERT_EQUAL(caABC->counter, 0);
ab->setAdditivity(false);
a->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 1);
LOGUNIT_ASSERT_EQUAL(caA->counter, 1);
LOGUNIT_ASSERT_EQUAL(caABC->counter, 0);
ab->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 1);
LOGUNIT_ASSERT_EQUAL(caA->counter, 1);
LOGUNIT_ASSERT_EQUAL(caABC->counter, 0);
abc->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 1);
LOGUNIT_ASSERT_EQUAL(caA->counter, 1);
LOGUNIT_ASSERT_EQUAL(caABC->counter, 1);
}
void testDisable1()
{
CountingAppenderPtr caRoot = new CountingAppender();
LoggerPtr root = Logger::getRootLogger();
root->addAppender(caRoot);
LoggerRepositoryPtr h = LogManager::getLoggerRepository();
//h.disableDebug();
h->setThreshold(Level::getInfo());
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 0);
root->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 0);
root->info(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 1);
root->log(Level::getWarn(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 2);
root->warn(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 3);
//h.disableInfo();
h->setThreshold(Level::getWarn());
root->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 3);
root->info(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 3);
root->log(Level::getWarn(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 4);
root->error(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 5);
root->log(Level::getError(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
//h.disableAll();
h->setThreshold(Level::getOff());
root->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->info(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getWarn(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->error(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getFatal(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getFatal(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
//h.disable(Level::getFatalLevel());
h->setThreshold(Level::getOff());
root->debug(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->info(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getWarn(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->error(MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getWarn(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
root->log(Level::getFatal(), MSG);
LOGUNIT_ASSERT_EQUAL(caRoot->counter, 6);
}
ResourceBundlePtr getBundle(const LogString & lang, const LogString & region)
{
Locale l(lang, region);
ResourceBundlePtr bundle(
PropertyResourceBundle::getBundle(LOG4CXX_STR("L7D"), l));
LOGUNIT_ASSERT(bundle != 0);
return bundle;
}
void testRB1()
{
ResourceBundlePtr rbUS(getBundle(LOG4CXX_STR("en"), LOG4CXX_STR("US")));
ResourceBundlePtr rbFR(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("FR")));
ResourceBundlePtr rbCH(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("CH")));
LoggerPtr root = Logger::getRootLogger();
root->setResourceBundle(rbUS);
ResourceBundlePtr t = root->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
LoggerPtr x = Logger::getLogger(LOG4CXX_TEST_STR("x"));
LoggerPtr x_y = Logger::getLogger(LOG4CXX_TEST_STR("x.y"));
LoggerPtr x_y_z = Logger::getLogger(LOG4CXX_TEST_STR("x.y.z"));
t = x->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
t = x_y->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
t = x_y_z->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
}
void testRB2()
{
LoggerPtr root = Logger::getRootLogger();
ResourceBundlePtr rbUS(getBundle(LOG4CXX_STR("en"), LOG4CXX_STR("US")));
ResourceBundlePtr rbFR(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("FR")));
ResourceBundlePtr rbCH(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("CH")));
root->setResourceBundle(rbUS);
ResourceBundlePtr t = root->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
LoggerPtr x = Logger::getLogger(LOG4CXX_TEST_STR("x"));
LoggerPtr x_y = Logger::getLogger(LOG4CXX_TEST_STR("x.y"));
LoggerPtr x_y_z = Logger::getLogger(LOG4CXX_TEST_STR("x.y.z"));
x_y->setResourceBundle(rbFR);
t = x->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
t = x_y->getResourceBundle();
LOGUNIT_ASSERT(t == rbFR);
t = x_y_z->getResourceBundle();
LOGUNIT_ASSERT(t == rbFR);
}
void testRB3()
{
ResourceBundlePtr rbUS(getBundle(LOG4CXX_STR("en"), LOG4CXX_STR("US")));
ResourceBundlePtr rbFR(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("FR")));
ResourceBundlePtr rbCH(getBundle(LOG4CXX_STR("fr"), LOG4CXX_STR("CH")));
LoggerPtr root = Logger::getRootLogger();
root->setResourceBundle(rbUS);
ResourceBundlePtr t = root->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
LoggerPtr x = Logger::getLogger(LOG4CXX_TEST_STR("x"));
LoggerPtr x_y = Logger::getLogger(LOG4CXX_TEST_STR("x.y"));
LoggerPtr x_y_z = Logger::getLogger(LOG4CXX_TEST_STR("x.y.z"));
x_y->setResourceBundle(rbFR);
x_y_z->setResourceBundle(rbCH);
t = x->getResourceBundle();
LOGUNIT_ASSERT(t == rbUS);
t = x_y->getResourceBundle();
LOGUNIT_ASSERT(t == rbFR);
t = x_y_z->getResourceBundle();
LOGUNIT_ASSERT(t == rbCH);
}
void testExists()
{
LoggerPtr a = Logger::getLogger(LOG4CXX_TEST_STR("a"));
LoggerPtr a_b = Logger::getLogger(LOG4CXX_TEST_STR("a.b"));
LoggerPtr a_b_c = Logger::getLogger(LOG4CXX_TEST_STR("a.b.c"));
LoggerPtr t;
t = LogManager::exists(LOG4CXX_TEST_STR("xx"));
LOGUNIT_ASSERT(t == 0);
t = LogManager::exists(LOG4CXX_TEST_STR("a"));
LOGUNIT_ASSERT_EQUAL(a, t);
t = LogManager::exists(LOG4CXX_TEST_STR("a.b"));
LOGUNIT_ASSERT_EQUAL(a_b, t);
t = LogManager::exists(LOG4CXX_TEST_STR("a.b.c"));
LOGUNIT_ASSERT_EQUAL(a_b_c, t);
}
void testHierarchy1()
{
LoggerRepositoryPtr h = new Hierarchy();
LoggerPtr root(h->getRootLogger());
root->setLevel(Level::getError());
LoggerPtr a0 = h->getLogger(LOG4CXX_STR("a"));
LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("a"), a0->getName());
LOGUNIT_ASSERT(a0->getLevel() == 0);
LOGUNIT_ASSERT(Level::getError() == a0->getEffectiveLevel());
LoggerPtr a11 = h->getLogger(LOG4CXX_STR("a"));
LOGUNIT_ASSERT_EQUAL(a0, a11);
}
void compileTestForLOGCXX202() const
{
//
// prior to fix, these line would compile.
//
(*logger).info("Hello, World.");
((Logger*) logger)->info("Hello, World.");
//
// this one would not.
//
logger->info("Hello, World.");
}
/**
* Tests logger.trace(Object).
*
*/
void testTrace()
{
VectorAppenderPtr appender = new VectorAppender();
LoggerPtr root = Logger::getRootLogger();
root->addAppender(appender);
root->setLevel(Level::getInfo());
LoggerPtr tracer = Logger::getLogger("com.example.Tracer");
tracer->setLevel(Level::getTrace());
LOG4CXX_TRACE(tracer, "Message 1");
LOG4CXX_TRACE(root, "Discarded Message");
LOG4CXX_TRACE(root, "Discarded Message");
std::vector<LoggingEventPtr> msgs(appender->vector);
LOGUNIT_ASSERT_EQUAL((size_t) 1, msgs.size());
LoggingEventPtr event = msgs[0];
LOGUNIT_ASSERT_EQUAL((int) Level::TRACE_INT, event->getLevel()->toInt());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("Message 1")), event->getMessage());
}
/**
* Tests isTraceEnabled.
*
*/
void testIsTraceEnabled()
{
VectorAppenderPtr appender = new VectorAppender();
LoggerPtr root = Logger::getRootLogger();
root->addAppender(appender);
root->setLevel(Level::getInfo());
LoggerPtr tracer = Logger::getLogger("com.example.Tracer");
tracer->setLevel(Level::getTrace());
LOGUNIT_ASSERT_EQUAL(true, tracer->isTraceEnabled());
LOGUNIT_ASSERT_EQUAL(false, root->isTraceEnabled());
}
protected:
static LogString MSG;
LoggerPtr logger;
AppenderPtr a1;
AppenderPtr a2;
};
LogString LoggerTestCase::MSG(LOG4CXX_STR("M"));
LOGUNIT_TEST_SUITE_REGISTRATION(LoggerTestCase);