This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new db966adc A configurator is responsible for the LoggerRepository state 
(#549)
db966adc is described below

commit db966adcbe5e32311ecc083a10cbd0210eb8693c
Author: Stephen Webb <[email protected]>
AuthorDate: Sat Oct 4 12:12:56 2025 +1000

    A configurator is responsible for the LoggerRepository state (#549)
---
 src/examples/cpp/console.cpp           |   1 +
 src/main/cpp/hierarchy.cpp             |   8 +-
 src/main/include/log4cxx/hierarchy.h   |   6 +-
 src/test/cpp/asyncappendertestcase.cpp | 237 +++++++++++++++++++--------------
 src/test/cpp/benchmark/benchmark.cpp   |   1 +
 src/test/cpp/levelchangetestcase.cpp   |   2 +
 src/test/cpp/terminationtestcase.cpp   |   1 +
 7 files changed, 153 insertions(+), 103 deletions(-)

diff --git a/src/examples/cpp/console.cpp b/src/examples/cpp/console.cpp
index d0688a42..8a3d9571 100644
--- a/src/examples/cpp/console.cpp
+++ b/src/examples/cpp/console.cpp
@@ -38,6 +38,7 @@ static void configure(bool err)
             , err ? ConsoleAppender::getSystemErr() : 
ConsoleAppender::getSystemOut()
             );
         r->getRootLogger()->addAppender(appender);
+        r->setConfigured(true);
     });
 }
 
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index b081a7d9..3945d78e 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -49,7 +49,7 @@ struct Hierarchy::HierarchyPrivate
 
        helpers::Pool pool;
        mutable std::recursive_mutex mutex;
-       mutable std::mutex configuredMutex;
+       mutable std::recursive_mutex configuredMutex;
        bool configured;
        bool emittedNoAppenderWarning;
        bool emittedNoResourceBundleWarning;
@@ -303,7 +303,7 @@ bool Hierarchy::isDisabled(int level) const
 
 void Hierarchy::ensureIsConfigured(std::function<void()> configurator)
 {
-       std::lock_guard<std::mutex> lock(m_priv->configuredMutex);
+       std::lock_guard<std::recursive_mutex> lock(m_priv->configuredMutex);
        if (!m_priv->configured && m_priv->alreadyTriedMethod != 
configurator.target_type().name())
        {
                configurator();
@@ -446,14 +446,14 @@ void Hierarchy::updateChildren(const Logger* parent)
 
 void Hierarchy::setConfigured(bool newValue)
 {
-       std::unique_lock<std::mutex> lock(m_priv->configuredMutex, 
std::try_to_lock);
+       std::unique_lock<std::recursive_mutex> lock(m_priv->configuredMutex, 
std::try_to_lock);
        if (lock.owns_lock()) // Not being auto-configured?
                m_priv->configured = newValue;
 }
 
 bool Hierarchy::isConfigured()
 {
-       std::lock_guard<std::mutex> lock(m_priv->configuredMutex); // Blocks 
while auto-configuration is active
+       std::lock_guard<std::recursive_mutex> lock(m_priv->configuredMutex); // 
Blocks while auto-configuration is active
        return m_priv->configured;
 }
 
diff --git a/src/main/include/log4cxx/hierarchy.h 
b/src/main/include/log4cxx/hierarchy.h
index 55c27fcf..9bfae700 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -86,8 +86,12 @@ class LOG4CXX_EXPORT Hierarchy : public spi::LoggerRepository
 #else
                void removeHierarchyEventListener(const 
spi::HierarchyEventListenerPtr& listener) override;
 #endif
+
                /**
-                * Call \c configurator if not yet configured.
+                * Call \c configurator if not yet configured and \c 
configurator has not already been tried.
+                * If \c configurator succeeds, it must call 
LoggerRepository::setConfigured
+                * to ensure subsequent calls to 
LoggerRepository::ensureIsConfigured
+                * from overwriting the configuration.
                 */
                void ensureIsConfigured(std::function<void()> configurator) 
override;
 
diff --git a/src/test/cpp/asyncappendertestcase.cpp 
b/src/test/cpp/asyncappendertestcase.cpp
index 42a2eaae..9ba7e173 100644
--- a/src/test/cpp/asyncappendertestcase.cpp
+++ b/src/test/cpp/asyncappendertestcase.cpp
@@ -95,6 +95,7 @@ class BlockableVectorAppender : public VectorAppender
                }
 
 };
+LOG4CXX_PTR_DEF(BlockableVectorAppender);
 
 /**
  * An appender that adds logging events
@@ -104,7 +105,7 @@ class LoggingVectorAppender : public VectorAppender
        LoggerInstancePtr logger{ "LoggingVectorAppender" };
        void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& 
p) override
        {
-               auto lsMsg = event->getRenderedMessage();
+               auto& lsMsg = event->getRenderedMessage();
                VectorAppender::append(event, p);
                if (LogString::npos != lsMsg.find(LOG4CXX_STR("World")))
                {
@@ -115,6 +116,7 @@ class LoggingVectorAppender : public VectorAppender
                }
        }
 };
+LOG4CXX_PTR_DEF(LoggingVectorAppender);
 
 /**
  * Tests of AsyncAppender.
@@ -129,7 +131,6 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                LOGUNIT_TEST(testSetOptionThreshold);
 
                LOGUNIT_TEST(closeTest);
-               LOGUNIT_TEST(test2);
                LOGUNIT_TEST(testAutoMessageBufferSelection);
                LOGUNIT_TEST(testEventFlush);
                LOGUNIT_TEST(testMultiThread);
@@ -162,63 +163,59 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        AppenderSkeletonTestCase::tearDown();
                }
 
-               AppenderSkeleton* createAppenderSkeleton() const
+               AppenderSkeleton* createAppenderSkeleton() const override
                {
                        return new AsyncAppender();
                }
 
-               // this test checks whether it is possible to write to a closed 
AsyncAppender
+               // Check it is not possible to write to a closed AsyncAppender
                void closeTest()
                {
-                       LoggerPtr root = Logger::getRootLogger();
-                       LayoutPtr layout = LayoutPtr(new SimpleLayout());
-                       VectorAppenderPtr vectorAppender = 
VectorAppenderPtr(new VectorAppender());
-                       AsyncAppenderPtr asyncAppender = AsyncAppenderPtr(new 
AsyncAppender());
-                       asyncAppender->setName(LOG4CXX_STR("async-CloseTest"));
-                       asyncAppender->addAppender(vectorAppender);
-                       root->addAppender(asyncAppender);
-
-                       root->debug(LOG4CXX_TEST_STR("m1"));
-                       asyncAppender->close();
-                       root->debug(LOG4CXX_TEST_STR("m2"));
-
-                       const std::vector<spi::LoggingEventPtr>& v = 
vectorAppender->getVector();
-                       LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
-               }
-
-               // this test checks whether appenders embedded within an 
AsyncAppender are also
-               // closed
-               void test2()
-               {
-                       LoggerPtr root = Logger::getRootLogger();
-                       LayoutPtr layout = SimpleLayoutPtr(new SimpleLayout());
-                       VectorAppenderPtr vectorAppender = 
VectorAppenderPtr(new VectorAppender());
-                       AsyncAppenderPtr asyncAppender = AsyncAppenderPtr(new 
AsyncAppender());
-                       asyncAppender->setName(LOG4CXX_STR("async-test2"));
+                       AsyncAppenderPtr asyncAppender;
+                       auto r = LogManager::getLoggerRepository();
+                       r->ensureIsConfigured([r, &asyncAppender]()
+                       {
+                               asyncAppender = 
std::make_shared<AsyncAppender>();
+                               
asyncAppender->setName(LOG4CXX_STR("async-CloseTest"));
+                               r->getRootLogger()->addAppender(asyncAppender);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(asyncAppender);
+                       auto vectorAppender = 
std::make_shared<VectorAppender>();
                        asyncAppender->addAppender(vectorAppender);
-                       root->addAppender(asyncAppender);
 
+                       auto root = r->getRootLogger();
                        root->debug(LOG4CXX_TEST_STR("m1"));
                        asyncAppender->close();
                        root->debug(LOG4CXX_TEST_STR("m2"));
 
-                       const std::vector<spi::LoggingEventPtr>& v = 
vectorAppender->getVector();
-                       LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
+                       // Check one message was received
+                       auto& v = vectorAppender->getVector();
+                       LOGUNIT_ASSERT_EQUAL(1, int(v.size()));
+                       // Check appender embedded within an AsyncAppender is 
also closed
                        LOGUNIT_ASSERT(vectorAppender->isClosed());
                }
 
                // Test behaviour when logging with a char type that is not 
logchar
                void testAutoMessageBufferSelection()
                {
+                       // Configure Log4cxx
                        VectorAppenderPtr vectorAppender;
                        auto r = LogManager::getLoggerRepository();
                        r->ensureIsConfigured([r, &vectorAppender]()
                        {
                                vectorAppender = 
std::make_shared<VectorAppender>();
                                r->getRootLogger()->addAppender(vectorAppender);
+                               r->setConfigured(true);
                        });
-                       auto root = r->getRootLogger();
 
+                       // Log some messages
+                       auto root = r->getRootLogger();
+#if LOG4CXX_LOGCHAR_IS_UTF8
+                       LOG4CXX_INFO(root, L"Some wide string " << 42);
+#else
+                       LOG4CXX_INFO(root, "Some narrow string " << 42);
+#endif
                        int expectedMessageCount = 1;
 #ifdef LOG4CXX_XXXX_ASYNC_MACROS_WORK_WITH_ANY_CHAR_TYPE
                        ++expectedMessageCount
@@ -229,11 +226,7 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
 #endif
 #endif // LOG4CXX_XXXX_ASYNC_MACROS_WORK_WITH_ANY_CHAR_TYPE
 
-#if LOG4CXX_LOGCHAR_IS_UTF8
-                       LOG4CXX_INFO(root, L"Some wide string " << 42);
-#else
-                       LOG4CXX_INFO(root, "Some narrow string " << 42);
-#endif
+                       // Check all messages were received
                        auto& v = vectorAppender->getVector();
                        LOGUNIT_ASSERT_EQUAL(expectedMessageCount, 
int(v.size()));
                }
@@ -241,20 +234,28 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                // this test checks all messages are delivered when an 
AsyncAppender is closed
                void testEventFlush()
                {
-                       size_t LEN = 200; // Larger than default buffer size 
(128)
-                       LoggerPtr root = Logger::getRootLogger();
-                       VectorAppenderPtr vectorAppender = 
VectorAppenderPtr(new VectorAppender());
+                       // Configure Log4cxx
+                       auto r = LogManager::getLoggerRepository();
+                       AsyncAppenderPtr asyncAppender;
+                       r->ensureIsConfigured([r, &asyncAppender]()
+                       {
+                               asyncAppender = 
std::make_shared<AsyncAppender>();
+                               
asyncAppender->setName(LOG4CXX_STR("async-testEventFlush"));
+                               r->getRootLogger()->addAppender(asyncAppender);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(asyncAppender);
+                       auto vectorAppender = 
std::make_shared<VectorAppender>();
                        vectorAppender->setMillisecondDelay(1);
-                       AsyncAppenderPtr asyncAppender = AsyncAppenderPtr(new 
AsyncAppender());
-                       
asyncAppender->setName(LOG4CXX_STR("async-testEventFlush"));
                        asyncAppender->addAppender(vectorAppender);
-                       root->addAppender(asyncAppender);
 
+                       // Log some messages
+                       auto root = r->getRootLogger();
+                       size_t LEN = 200; // Larger than default buffer size 
(128)
                        for (size_t i = 0; i < LEN; i++)
                        {
                                LOG4CXX_DEBUG_ASYNC(root, "message" << i);
                        }
-
                        asyncAppender->close();
                        root->debug(LOG4CXX_STR("m2"));
 
@@ -274,15 +275,24 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                // this test checks all messages are delivered from multiple 
threads
                void testMultiThread()
                {
-                       int LEN = 2000; // Larger than default buffer size (128)
-                       auto threadCount = 
std::max(static_cast<int>(std::thread::hardware_concurrency() - 1), 2);
-                       auto root = Logger::getRootLogger();
+                       // Configure Log4cxx
+                       AsyncAppenderPtr asyncAppender;
+                       auto r = LogManager::getLoggerRepository();
+                       r->ensureIsConfigured([r, &asyncAppender]()
+                       {
+                               asyncAppender = 
std::make_shared<AsyncAppender>();
+                               
asyncAppender->setName(LOG4CXX_STR("async-testMultiThread"));
+                               r->getRootLogger()->addAppender(asyncAppender);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(asyncAppender);
                        auto vectorAppender = 
std::make_shared<VectorAppender>();
-                       auto asyncAppender = std::make_shared<AsyncAppender>();
-                       
asyncAppender->setName(LOG4CXX_STR("async-testMultiThread"));
                        asyncAppender->addAppender(vectorAppender);
-                       root->addAppender(asyncAppender);
 
+                       // Log some messages
+                       int LEN = 2000; // Larger than default buffer size (128)
+                       auto threadCount = 
std::max(static_cast<int>(std::thread::hardware_concurrency() - 1), 2);
+                       auto root = r->getRootLogger();
                        std::vector<std::thread> threads;
                        for ( int x = 0; x < threadCount; x++ )
                        {
@@ -304,7 +314,8 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        }
                        asyncAppender->close();
 
-                       const std::vector<spi::LoggingEventPtr>& v = 
vectorAppender->getVector();
+                       // Check all message were received
+                       auto& v = vectorAppender->getVector();
                        LOGUNIT_ASSERT_EQUAL(LEN*threadCount, (int)v.size());
                        std::map<LogString, int> perThreadCount;
                        std::vector<int> msgCount(LEN, 0);
@@ -330,28 +341,36 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                 */
                void testBadAppender()
                {
-                       AppenderPtr nullPointerAppender(new 
NullPointerAppender());
-                       AsyncAppenderPtr asyncAppender(new AsyncAppender());
-                       
asyncAppender->setName(LOG4CXX_STR("async-testBadAppender"));
-                       asyncAppender->addAppender(nullPointerAppender);
-                       asyncAppender->setBufferSize(5);
-                       Pool p;
-                       asyncAppender->activateOptions(p);
-                       LoggerPtr root = Logger::getRootLogger();
-                       root->addAppender(asyncAppender);
-
-                       varia::FallbackErrorHandlerPtr errorHandler(new 
varia::FallbackErrorHandler());
-                       errorHandler->setAppender(asyncAppender);
-                       VectorAppenderPtr vectorAppender(new VectorAppender());
+                       // Configure Log4cxx
+                       AsyncAppenderPtr asyncAppender;
+                       auto r = LogManager::getLoggerRepository();
+                       r->ensureIsConfigured([r, &asyncAppender]()
+                       {
+                               asyncAppender = 
std::make_shared<AsyncAppender>();
+                               
asyncAppender->setName(LOG4CXX_STR("async-testBadAppender"));
+                               
asyncAppender->addAppender(std::make_shared<NullPointerAppender>());
+                               Pool p;
+                               asyncAppender->activateOptions(p);
+                               r->getRootLogger()->addAppender(asyncAppender);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(asyncAppender);
+                       auto vectorAppender = 
std::make_shared<VectorAppender>();
                        
vectorAppender->setName(LOG4CXX_STR("async-memoryAppender"));
+                       auto root = r->getRootLogger();
+                       auto errorHandler = 
std::make_shared<varia::FallbackErrorHandler>();
+                       errorHandler->setAppender(asyncAppender);
                        errorHandler->setBackupAppender(vectorAppender);
                        errorHandler->setLogger(root);
                        asyncAppender->setErrorHandler(errorHandler);
 
+                       // Log some messages
                        LOG4CXX_INFO(root, "Message");
                        std::this_thread::sleep_for( std::chrono::milliseconds( 
30 ) );
                        LOGUNIT_ASSERT(errorHandler->errorReported());
                        LOG4CXX_INFO(root, "Message");
+
+                       // Check a message was received
                        auto& v = vectorAppender->getVector();
                        LOGUNIT_ASSERT(0 < v.size());
                }
@@ -361,18 +380,27 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                 */
                void testBufferOverflowBehavior()
                {
+                       // Configure Log4cxx
+                       AsyncAppenderPtr async;
+                       auto r = LogManager::getLoggerRepository();
+                       r->ensureIsConfigured([r, &async]()
+                       {
+                               async = std::make_shared<AsyncAppender>();
+                               
async->setName(LOG4CXX_STR("async-testBufferOverflowBehavior"));
+                               async->setBufferSize(5);
+                               async->setBlocking(false);
+                               Pool p;
+                               async->activateOptions(p);
+                               r->getRootLogger()->addAppender(async);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(async);
                        auto blockableAppender = 
std::make_shared<BlockableVectorAppender>();
                        
blockableAppender->setName(LOG4CXX_STR("async-blockableVector"));
-                       auto async = std::make_shared<AsyncAppender>();
-                       
async->setName(LOG4CXX_STR("async-testBufferOverflowBehavior"));
                        async->addAppender(blockableAppender);
-                       async->setBufferSize(5);
-                       async->setLocationInfo(true);
-                       async->setBlocking(false);
-                       Pool p;
-                       async->activateOptions(p);
-                       auto rootLogger = Logger::getRootLogger();
-                       rootLogger->addAppender(async);
+
+                       // Log some messages
+                       auto rootLogger = r->getRootLogger();
                        LOG4CXX_INFO_ASYNC(rootLogger, "Hello, World"); // This 
causes the dispatch thread creation
                        std::this_thread::sleep_for( std::chrono::milliseconds( 
10 ) ); // Wait for the dispatch thread  to be ready
                        {
@@ -407,6 +435,7 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        }
                        if (helpers::LogLog::isDebugEnabled())
                        {
+                               Pool p;
                                LogString msg{ LOG4CXX_STR("messageCounts:") };
                                for (auto& item : levelCount)
                                {
@@ -436,17 +465,26 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                 */
                void testLoggingAppender()
                {
+                       // Configure Log4cxx
+                       AsyncAppenderPtr async;
+                       auto r = LogManager::getLoggerRepository();
+                       r->ensureIsConfigured([r, &async]()
+                       {
+                               async = std::make_shared<AsyncAppender>();
+                               
async->setName(LOG4CXX_STR("withLoggingAppender"));
+                               async->setBufferSize(5);
+                               Pool p;
+                               async->activateOptions(p);
+                               r->getRootLogger()->addAppender(async);
+                               r->setConfigured(true);
+                       });
+                       LOGUNIT_ASSERT(async);
                        auto loggingAppender = 
std::make_shared<LoggingVectorAppender>();
                        
loggingAppender->setName(LOG4CXX_STR("loggingAppender"));
-                       auto async = std::make_shared<AsyncAppender>();
-                       async->setName(LOG4CXX_STR("withLoggingAppender"));
                        async->addAppender(loggingAppender);
-                       async->setBufferSize(5);
-                       async->setLocationInfo(true);
-                       Pool p;
-                       async->activateOptions(p);
-                       auto rootLogger = Logger::getRootLogger();
-                       rootLogger->addAppender(async);
+
+                       // Log some messages
+                       auto rootLogger = r->getRootLogger();
                        LOG4CXX_INFO_ASYNC(rootLogger, "Hello, World"); // This 
causes the dispatch thread creation
                        std::this_thread::sleep_for( std::chrono::milliseconds( 
10 ) ); // Wait for the dispatch thread  to be ready
                        for (int i = 0; i < 10; i++)
@@ -456,6 +494,8 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        LOG4CXX_INFO_ASYNC(rootLogger, "Bye bye World");
                        std::this_thread::sleep_for( std::chrono::milliseconds( 
10 ) ); // Wait for the dispatch thread take the above events
                        async->close();
+
+                       // Check which messages were received
                        auto& events = loggingAppender->getVector();
                        std::map<LevelPtr, int> levelCount;
                        int discardMessageCount{ 0 };
@@ -475,6 +515,7 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        }
                        if (helpers::LogLog::isDebugEnabled())
                        {
+                               Pool p;
                                LogString msg{ LOG4CXX_STR("messageCounts:") };
                                msg += LOG4CXX_STR(" nonAppender ");
                                StringHelper::toString(eventCount[0], p, msg);
@@ -492,34 +533,34 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
 #if LOG4CXX_HAS_DOMCONFIGURATOR
                void testConfiguration()
                {
+                       // Configure Log4cxx
                        auto status = 
xml::DOMConfigurator::configure("input/xml/asyncAppender1.xml");
                        LOGUNIT_ASSERT_EQUAL(status, 
spi::ConfigurationStatus::Configured);
-                       AsyncAppenderPtr asyncAppender = 
log4cxx::cast<AsyncAppender>(Logger::getRootLogger()->getAppender(LOG4CXX_STR("ASYNC")));
-                       LOGUNIT_ASSERT(!(asyncAppender == 0));
+
+                       // Check configuration is as expected
+                       auto  root = Logger::getRootLogger();
+                       auto asyncAppender = 
log4cxx::cast<AsyncAppender>(root->getAppender(LOG4CXX_STR("ASYNC")));
+                       LOGUNIT_ASSERT(asyncAppender);
                        LOGUNIT_ASSERT_EQUAL(100, 
asyncAppender->getBufferSize());
                        LOGUNIT_ASSERT_EQUAL(false, 
asyncAppender->getBlocking());
                        LOGUNIT_ASSERT_EQUAL(true, 
asyncAppender->getLocationInfo());
-                       AppenderList 
nestedAppenders(asyncAppender->getAllAppenders());
-                       // TODO:
-                       // test seems to work okay, but have not found a 
working way to
-                       // get a reference to the nested vector appender
-                       //
-                       // LOGUNIT_ASSERT_EQUAL((size_t) 1, 
nestedAppenders.size());
-                       // VectorAppenderPtr vectorAppender(nestedAppenders[0]);
-                       // LOGUNIT_ASSERT(0 != vectorAppender);
-                       LoggerPtr root(Logger::getRootLogger());
+                       auto nestedAppenders = asyncAppender->getAllAppenders();
+                       LOGUNIT_ASSERT_EQUAL(1, int(nestedAppenders.size()));
 
+                       // Log some messages
                        size_t LEN = 20;
-
                        for (size_t i = 0; i < LEN; i++)
                        {
                                LOG4CXX_DEBUG_ASYNC(root, "message" << i);
                        }
-
                        asyncAppender->close();
-                       // const std::vector<spi::LoggingEventPtr>& v = 
vectorAppender->getVector();
-                       // LOGUNIT_ASSERT_EQUAL(LEN, v.size());
-                       // LOGUNIT_ASSERT_EQUAL(true, 
vectorAppender->isClosed());
+
+                       // Check all message were received
+                       auto vectorAppender = 
log4cxx::cast<VectorAppender>(asyncAppender->getAppender(LOG4CXX_STR("VECTOR")));
+                       LOGUNIT_ASSERT(vectorAppender);
+                       auto& v = vectorAppender->getVector();
+                       LOGUNIT_ASSERT_EQUAL(LEN, v.size());
+                       LOGUNIT_ASSERT(vectorAppender->isClosed());
                }
 #endif
 
diff --git a/src/test/cpp/benchmark/benchmark.cpp 
b/src/test/cpp/benchmark/benchmark.cpp
index 3de48d53..85a348c2 100644
--- a/src/test/cpp/benchmark/benchmark.cpp
+++ b/src/test/cpp/benchmark/benchmark.cpp
@@ -173,6 +173,7 @@ public: // Class methods
                        auto writer = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
                        writer->setName(LOG4CXX_STR("NullAppender"));
                        r->getRootLogger()->addAppender(writer);
+                       r->setConfigured(true);
                        });
        }
 
diff --git a/src/test/cpp/levelchangetestcase.cpp 
b/src/test/cpp/levelchangetestcase.cpp
index c935d930..8befde16 100644
--- a/src/test/cpp/levelchangetestcase.cpp
+++ b/src/test/cpp/levelchangetestcase.cpp
@@ -59,6 +59,7 @@ LoggerPtr getLogger(const LogString& name = LogString())
        r->ensureIsConfigured([r]()
                {
                        
r->getRootLogger()->addAppender(std::make_shared<CountingAppender>());
+                       r->setConfigured(true);
                });
        return name.empty() ? r->getRootLogger() : r->getLogger(name);
 }
@@ -110,6 +111,7 @@ public:
        void testLevelChange()
        {
                auto appender = 
dynamic_cast<CountingAppender*>(getLogger()->getAppender(LOG4CXX_STR("counter")).get());
+               
LOGUNIT_ASSERT(LogManager::getLoggerRepository()->isConfigured());
                LOGUNIT_ASSERT(appender);
 
                auto myLogger = getLogger(LOG4CXX_STR("Controller"));
diff --git a/src/test/cpp/terminationtestcase.cpp 
b/src/test/cpp/terminationtestcase.cpp
index 548d979f..17205ed7 100644
--- a/src/test/cpp/terminationtestcase.cpp
+++ b/src/test/cpp/terminationtestcase.cpp
@@ -42,6 +42,7 @@ public:
                        auto asyncAppender = std::make_shared<AsyncAppender>();
                        asyncAppender->addAppender(vectorAppender);
                        r->getRootLogger()->addAppender(asyncAppender);
+                       r->setConfigured(true);
                        }
                );
        }

Reply via email to