blob: 271e65eb17b8561e118cb981419d91b20e90ca3d [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 <ostream>
#include <iomanip>
#include "vectorappender.h"
#include <log4cxx/logmanager.h>
#include <log4cxx/simplelayout.h>
#include <log4cxx/spi/loggingevent.h>
#include "insertwide.h"
#include "logunit.h"
#include <log4cxx/stream.h>
#if LOG4CXX_CFSTRING_API
#include <CoreFoundation/CFString.h>
#endif
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace std;
class ExceptionOnInsert
{
public:
ExceptionOnInsert()
{
}
};
//
// define an insertion operation that will throw an
// exception to test that evaluation was short
// circuited
//
template<class Elem, class Tr>
::std::basic_ostream<Elem, Tr>& operator<<(
::std::basic_ostream<Elem, Tr>&,
const ExceptionOnInsert&)
{
throw std::exception();
}
/**
Unit tests for the optional stream-like interface for log4cxx
*/
LOGUNIT_CLASS(StreamTestCase)
{
LOGUNIT_TEST_SUITE(StreamTestCase);
LOGUNIT_TEST(testSimple);
LOGUNIT_TEST(testMultiple);
LOGUNIT_TEST(testShortCircuit);
LOGUNIT_TEST_EXCEPTION(testInsertException, std::exception);
LOGUNIT_TEST(testScientific);
LOGUNIT_TEST(testPrecision);
LOGUNIT_TEST(testWidth);
#if LOG4CXX_WCHAR_T_API
LOGUNIT_TEST(testWide);
LOGUNIT_TEST(testWideAppend);
LOGUNIT_TEST(testWideWidth);
#endif
LOGUNIT_TEST(testBaseFlags);
LOGUNIT_TEST(testBasePrecisionAndWidth);
LOGUNIT_TEST(testLogStreamSimple);
LOGUNIT_TEST(testLogStreamMultiple);
LOGUNIT_TEST(testLogStreamShortCircuit);
LOGUNIT_TEST_EXCEPTION(testLogStreamInsertException, std::exception);
LOGUNIT_TEST(testLogStreamScientific);
LOGUNIT_TEST(testLogStreamPrecision);
LOGUNIT_TEST(testLogStreamWidth);
LOGUNIT_TEST(testLogStreamDelegate);
LOGUNIT_TEST(testLogStreamFormattingPersists);
LOGUNIT_TEST(testSetWidthInsert);
#if LOG4CXX_WCHAR_T_API
LOGUNIT_TEST(testWLogStreamSimple);
LOGUNIT_TEST(testWLogStreamMultiple);
LOGUNIT_TEST(testWLogStreamShortCircuit);
LOGUNIT_TEST_EXCEPTION(testWLogStreamInsertException, std::exception);
LOGUNIT_TEST(testWLogStreamScientific);
LOGUNIT_TEST(testWLogStreamPrecision);
LOGUNIT_TEST(testWLogStreamWidth);
LOGUNIT_TEST(testWLogStreamDelegate);
LOGUNIT_TEST(testWLogStreamFormattingPersists);
LOGUNIT_TEST(testWSetWidthInsert);
#endif
#if LOG4CXX_UNICHAR_API
LOGUNIT_TEST(testUniChar);
LOGUNIT_TEST(testUniCharAppend);
// LOGUNIT_TEST(testUniCharWidth);
LOGUNIT_TEST(testULogStreamSimple);
LOGUNIT_TEST(testULogStreamMultiple);
LOGUNIT_TEST(testULogStreamShortCircuit);
LOGUNIT_TEST_EXCEPTION(testULogStreamInsertException, std::exception);
// LOGUNIT_TEST(testULogStreamScientific);
// LOGUNIT_TEST(testULogStreamPrecision);
// LOGUNIT_TEST(testULogStreamWidth);
LOGUNIT_TEST(testULogStreamDelegate);
// LOGUNIT_TEST(testULogStreamFormattingPersists);
// LOGUNIT_TEST(testUSetWidthInsert);
#endif
#if LOG4CXX_CFSTRING_API
LOGUNIT_TEST(testCFString);
LOGUNIT_TEST(testCFStringAppend);
LOGUNIT_TEST(testULogStreamCFString);
LOGUNIT_TEST(testULogStreamCFString2);
#endif
LOGUNIT_TEST_SUITE_END();
VectorAppenderPtr vectorAppender;
public:
void setUp()
{
LoggerPtr root(Logger::getRootLogger());
LayoutPtr layout(new SimpleLayout());
vectorAppender = new VectorAppender();
root->addAppender(vectorAppender);
}
void tearDown()
{
LogManager::shutdown();
}
void testSimple()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, "This is a test");
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testMultiple()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, "This is a test" << ": Details to follow");
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testShortCircuit()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.shortCircuit"));
logger->setLevel(Level::getInfo());
ExceptionOnInsert someObj;
LOG4CXX_DEBUG(logger, someObj);
LOGUNIT_ASSERT_EQUAL((size_t) 0, vectorAppender->getVector().size());
}
void testInsertException()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.insertException"));
ExceptionOnInsert someObj;
LOG4CXX_INFO(logger, someObj);
}
void testScientific()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, std::scientific << 0.000001115);
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("e-")) != LogString::npos ||
msg.find(LOG4CXX_STR("E-")) != LogString::npos);
}
void testPrecision()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, std::setprecision(4) << 1.000001);
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("1.00000")) == LogString::npos);
}
void testWidth()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, '[' << std::fixed << std::setprecision(2) << std::setw(7) << std::right << std::setfill('_') << 10.0 << ']');
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void testBaseFlags()
{
logstream base1(Logger::getRootLogger(), Level::getInfo());
logstream base2(Logger::getRootLogger(), Level::getInfo());
base1 << std::boolalpha;
base2 << std::noboolalpha;
std::ostringstream os1a, os1b, os2a, os2b;
os1a << std::boolalpha;
int fillchar;
if (base1.set_stream_state(os1b, fillchar))
{
os1b.fill(fillchar);
}
LOGUNIT_ASSERT_EQUAL(os1a.flags(), os1b.flags());
os2a << std::noboolalpha;
if (base2.set_stream_state(os2b, fillchar))
{
os2b.fill(fillchar);
}
LOGUNIT_ASSERT_EQUAL(os2a.flags(), os2b.flags());
}
void testBasePrecisionAndWidth()
{
logstream base(Logger::getRootLogger(), Level::getInfo());
base.precision(2);
base.width(5);
std::ostringstream os1, os2;
os1.precision(2);
os1.width(5);
os1 << 3.1415926;
int fillchar;
if (base.set_stream_state(os2, fillchar))
{
os2.fill(fillchar);
}
os2 << 3.1415926;
string expected(os1.str());
string actual(os2.str());
LOGUNIT_ASSERT_EQUAL(expected, actual);
}
void testLogStreamSimple()
{
logstream root(Logger::getRootLogger(), Level::getInfo());
root << std::string("This is a test") << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testLogStreamMultiple()
{
logstream root(Logger::getRootLogger(), Level::getInfo());
root << std::string("This is a test") << std::string(": Details to follow") << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testLogStreamShortCircuit()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.shortCircuit"));
logger->setLevel(Level::getInfo());
logstream os(logger, Level::getDebug());
ExceptionOnInsert someObj;
os << someObj << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 0, vectorAppender->getVector().size());
}
void testLogStreamInsertException()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.insertException"));
ExceptionOnInsert someObj;
logstream os(logger, Level::getInfo());
os << someObj << LOG4CXX_ENDMSG;
}
void testLogStreamScientific()
{
LoggerPtr root(Logger::getRootLogger());
logstream os(root, Level::getInfo());
os << std::scientific << 0.000001115 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("e-")) != LogString::npos ||
msg.find(LOG4CXX_STR("E-")) != LogString::npos);
}
void testLogStreamPrecision()
{
LoggerPtr root(Logger::getRootLogger());
logstream os(root, Level::getInfo());
os << std::setprecision(4) << 1.000001 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("1.00000")) == LogString::npos);
}
void testLogStreamWidth()
{
LoggerPtr root(Logger::getRootLogger());
logstream os(root, Level::getInfo());
os << '[' << std::fixed << std::setprecision(2) << std::setw(7) << std::right << std::setfill('_') << 10.0 << ']' << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void report(std::ostream & os)
{
os << "This just in: \n";
os << "Use logstream in places that expect a std::ostream.\n";
}
void testLogStreamDelegate()
{
logstream root(Logger::getRootLogger(), Level::getInfo());
report(root);
root << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testLogStreamFormattingPersists()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
logstream os(root, Level::getDebug());
os << std::hex << 20 << LOG4CXX_ENDMSG;
os << Level::getInfo() << 16 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("10")), msg);
}
void testSetWidthInsert()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
logstream os(root, Level::getInfo());
os << std::setw(5);
LOGUNIT_ASSERT_EQUAL(5, os.width());
}
#if LOG4CXX_WCHAR_T_API
void testWide()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, L"This is a test");
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testWideAppend()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, L"This is a test" << L": Details to follow");
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testWideWidth()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, L'[' << std::fixed << std::setprecision(2) << std::setw(7) << std::right << std::setfill(L'_') << 10.0 << L"]");
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void testWLogStreamSimple()
{
wlogstream root(Logger::getRootLogger(), Level::getInfo());
root << L"This is a test" << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testWLogStreamMultiple()
{
wlogstream root(Logger::getRootLogger(), Level::getInfo());
root << L"This is a test" << L": Details to follow" << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testWLogStreamShortCircuit()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.shortCircuit"));
logger->setLevel(Level::getInfo());
wlogstream os(logger, Level::getDebug());
ExceptionOnInsert someObj;
os << someObj << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 0, vectorAppender->getVector().size());
}
void testWLogStreamInsertException()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.insertException"));
ExceptionOnInsert someObj;
wlogstream os(logger, Level::getInfo());
os << someObj << LOG4CXX_ENDMSG;
}
void testWLogStreamScientific()
{
LoggerPtr root(Logger::getRootLogger());
wlogstream os(root, Level::getInfo());
os << std::scientific << 0.000001115 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("e-")) != LogString::npos ||
msg.find(LOG4CXX_STR("E-")) != LogString::npos);
}
void testWLogStreamPrecision()
{
LoggerPtr root(Logger::getRootLogger());
wlogstream os(root, Level::getInfo());
os << std::setprecision(4) << 1.000001 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("1.00000")) == LogString::npos);
}
void testWLogStreamWidth()
{
LoggerPtr root(Logger::getRootLogger());
wlogstream os(root, Level::getInfo());
os << L"[" << std::fixed << std::setprecision(2) << std::setw(7) << std::right << std::setfill(L'_') << 10.0 << L"]" << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void wreport(std::basic_ostream<wchar_t>& os)
{
os << L"This just in: \n";
os << L"Use logstream in places that expect a std::ostream.\n";
}
void testWLogStreamDelegate()
{
wlogstream root(Logger::getRootLogger(), Level::getInfo());
wreport(root);
root << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testWLogStreamFormattingPersists()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
wlogstream os(root, Level::getDebug());
os << std::hex << 20 << LOG4CXX_ENDMSG;
os << Level::getInfo() << 16 << LOG4CXX_ENDMSG;
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("10")), msg);
}
void testWSetWidthInsert()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
wlogstream os(root, Level::getInfo());
os << std::setw(5);
LOGUNIT_ASSERT_EQUAL(5, os.width());
}
#endif
#if LOG4CXX_UNICHAR_API
void testUniChar()
{
LoggerPtr root(Logger::getRootLogger());
const log4cxx::UniChar msg[] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', 0 };
LOG4CXX_INFO(root, msg)
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testUniCharAppend()
{
LoggerPtr root(Logger::getRootLogger());
const log4cxx::UniChar msg1[] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', 0 };
const log4cxx::UniChar msg2[] = { ':', ' ', 'D', 'e', 't', 'a', 'i', 'l', 's', ' ', 't', 'o', ' ', 'f', 'o', 'l', 'l', 'o', 'w', 0 };
LOG4CXX_INFO(root, msg1 << msg2)
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testUniCharWidth()
{
LoggerPtr root(Logger::getRootLogger());
const log4cxx::UniChar openBracket[] = { '[', 0 };
const log4cxx::UniChar closeBracket[] = { ']', 0 };
LOG4CXX_INFO(root, openBracket << std::fixed << std::setprecision(2) << std::setw(7) << std::right << std::setfill((log4cxx::UniChar) '_') << 10.0 << closeBracket)
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void testULogStreamSimple()
{
ulogstream root(Logger::getRootLogger(), Level::getInfo());
const log4cxx::UniChar msg[] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', 0 };
root << msg << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testULogStreamMultiple()
{
ulogstream root(Logger::getRootLogger(), Level::getInfo());
const log4cxx::UniChar msg1[] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', 0 };
const log4cxx::UniChar msg2[] = { ':', ' ', 'D', 'e', 't', 'a', 'i', 'l', 's', ' ', 't', 'o', ' ', 'f', 'o', 'l', 'l', 'o', 'w', 0 };
root << msg1 << msg2 << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testULogStreamShortCircuit()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.shortCircuit"));
logger->setLevel(Level::getInfo());
ulogstream os(logger, Level::getDebug());
ExceptionOnInsert someObj;
os << someObj << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 0, vectorAppender->getVector().size());
}
void testULogStreamInsertException()
{
LoggerPtr logger(Logger::getLogger("StreamTestCase.insertException"));
ExceptionOnInsert someObj;
ulogstream os(logger, Level::getInfo());
os << someObj << LOG4CXX_ENDMSG;
}
void testULogStreamScientific()
{
LoggerPtr root(Logger::getRootLogger());
ulogstream os(root, Level::getInfo());
os << std::scientific << 0.000001115 << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("e-")) != LogString::npos ||
msg.find(LOG4CXX_STR("E-")) != LogString::npos);
}
void testULogStreamPrecision()
{
LoggerPtr root(Logger::getRootLogger());
ulogstream os(root, Level::getInfo());
os << std::setprecision(4) << 1.000001 << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT(msg.find(LOG4CXX_STR("1.00000")) == LogString::npos);
}
void testULogStreamWidth()
{
LoggerPtr root(Logger::getRootLogger());
ulogstream os(root, Level::getInfo());
const log4cxx::UniChar openBracket[] = { '[', 0 };
const log4cxx::UniChar closeBracket[] = { ']', 0 };
os << openBracket << std::fixed << std::setprecision(2) << std::setw(7) << std::right
<< std::setfill((log4cxx::UniChar) '_') << 10.0 << closeBracket << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("[__10.00]")), msg);
}
void ureport(std::basic_ostream<log4cxx::UniChar>& os)
{
const log4cxx::UniChar msg1[] = { 'T', 'h', 'i', 's', ' ', 'j', 'u', 's', 't', ' ', 'i', 'n', ':', ' ', '\n', 0 };
const log4cxx::UniChar msg2[] = { 'U', 's', 'e', ' ', 'l', 'o', 'g', 's', 't', 'r', 'e', 'a', 'm', '\n', 0 };
os << msg1;
os << msg2;
}
void testULogStreamDelegate()
{
ulogstream root(Logger::getRootLogger(), Level::getInfo());
ureport(root);
root << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testULogStreamFormattingPersists()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
ulogstream os(root, Level::getDebug());
os << std::hex << 20 << LOG4CXX_ENDMSG;
os << Level::getInfo() << 16 << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
spi::LoggingEventPtr event(vectorAppender->getVector()[0]);
LogString msg(event->getMessage());
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("10")), msg);
}
void testUSetWidthInsert()
{
LoggerPtr root(Logger::getRootLogger());
root->setLevel(Level::getInfo());
ulogstream os(root, Level::getInfo());
os << std::setw(5);
LOGUNIT_ASSERT_EQUAL(5, os.width());
}
#endif
#if LOG4CXX_CFSTRING_API
void testCFString()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, CFSTR("This is a test"))
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testCFStringAppend()
{
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, CFSTR("This is a test") << CFSTR(": Details to follow"))
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testULogStreamCFString()
{
ulogstream root(Logger::getRootLogger(), Level::getInfo());
root << CFSTR("This is a test") << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
void testULogStreamCFString2()
{
ulogstream root(Logger::getRootLogger(), Level::getInfo());
root << CFSTR("This is a test") << CFSTR(": Details to follow") << LOG4CXX_ENDMSG;
LOGUNIT_ASSERT_EQUAL((size_t) 1, vectorAppender->getVector().size());
}
#endif
};
LOGUNIT_TEST_SUITE_REGISTRATION(StreamTestCase);
#if !LOG4CXX_USE_GLOBAL_SCOPE_TEMPLATE
//
// The following code tests compilation errors
// around bug LOGCXX-150 and is not intended to be executed.
// Skipped for VC6 since it can't handle having the
// templated operator<< in class scope.s
namespace foo
{
class Bar
{
void fn();
};
std::ostream& operator<<(std::ostream& o, Bar const& b)
{
return o << "Bar";
}
}
using namespace foo;
namespace
{
log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("foo"));
log4cxx::logstream lout(logger, log4cxx::Level::getDebug());
}
void Bar::fn()
{
lout << "hi" << LOG4CXX_ENDMSG;
}
#endif