You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2023/04/15 04:40:54 UTC

[logging-log4cxx] branch master updated: Fix SMTP appender (#199)

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 cc2c49ef Fix SMTP appender (#199)
cc2c49ef is described below

commit cc2c49ef3573e97fea0fc6c0ceba6c44f270ff87
Author: Stephen Webb <st...@ieee.org>
AuthorDate: Sat Apr 15 14:40:49 2023 +1000

    Fix SMTP appender (#199)
    
    * HAS_LIBESMTP needs to globally available
    
    * Improve the configuration information for the SMTP appender
    
    * Add SMTP appender to CI tests
    
    * Update smtp appender test case to current log4cxx
    
    * Prevent segfault in smtpappendertestcase
    
    * Fix failing smtpappendertestcase
    
    * Add a disabled SMTP appender test that uses a valid configuration
---
 .github/workflows/log4cxx-cpp11.yml           |  4 +-
 .github/workflows/log4cxx-posix.yml           | 10 +---
 CMakeLists.txt                                | 17 ++++++-
 src/CMakeLists.txt                            |  4 ++
 src/cmake/FindESMTP.cmake                     | 72 +++++++++++++++++++++++++++
 src/main/cpp/domconfigurator.cpp              |  4 +-
 src/main/cpp/smtpappender.cpp                 | 33 ++++++------
 src/main/include/CMakeLists.txt               | 10 ----
 src/main/include/log4cxx/net/smtpappender.h   | 64 +++++++++++++++++++++---
 src/main/include/log4cxx/private/string_c11.h |  2 +-
 src/test/cpp/CMakeLists.txt                   |  3 ++
 src/test/cpp/net/CMakeLists.txt               |  4 +-
 src/test/cpp/net/smtpappendertestcase.cpp     | 45 +++++++++--------
 13 files changed, 200 insertions(+), 72 deletions(-)

diff --git a/.github/workflows/log4cxx-cpp11.yml b/.github/workflows/log4cxx-cpp11.yml
index 803c9b93..23f97219 100644
--- a/.github/workflows/log4cxx-cpp11.yml
+++ b/.github/workflows/log4cxx-cpp11.yml
@@ -29,14 +29,14 @@ jobs:
     - name: 'Configure Dependencies - Ubuntu'
       run: |
         sudo apt-get update
-        sudo apt-get install -y libapr1-dev libaprutil1-dev libboost-filesystem-dev libboost-thread-dev
+        sudo apt-get install -y libapr1-dev libaprutil1-dev libboost-filesystem-dev libboost-thread-dev libesmtp-dev
 
     - name: 'run cmake - *nix'
       run: |
         cd main
         mkdir build
         cd build
-        cmake -DCMAKE_CXX_STANDARD=11 ..
+        cmake -DCMAKE_CXX_STANDARD=11 -DLOG4CXX_ENABLE_ESMTP=ON ..
         cmake --build .
 
     - name: run unit tests
diff --git a/.github/workflows/log4cxx-posix.yml b/.github/workflows/log4cxx-posix.yml
index 7f3b98e2..fd78b451 100644
--- a/.github/workflows/log4cxx-posix.yml
+++ b/.github/workflows/log4cxx-posix.yml
@@ -24,16 +24,8 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        name: [ubuntu18-gcc, ubuntu18-clang, ubuntu20-gcc, ubuntu20-clang, ubuntu22-gcc, ubuntu22-clang, osx-11, osx-12]
+        name: [ubuntu20-gcc, ubuntu20-clang, ubuntu22-gcc, ubuntu22-clang, osx-11, osx-12]
         include:
-          - name: ubuntu18-gcc
-            os: ubuntu-18.04
-            cxx: g++
-            cc: gcc
-          - name: ubuntu18-clang
-            os: ubuntu-18.04
-            cxx: clang++
-            cc: clang
           - name: ubuntu20-gcc
             os: ubuntu-20.04
             cxx: g++
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ba969a67..52e7deed 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,6 +67,21 @@ elseif(TARGET expat::expat)
   set(EXPAT_LIBRARIES expat::expat)
 endif()
 
+option(LOG4CXX_ENABLE_ESMTP "Support logging via libesmtp" OFF)
+option(LIBESMTP_STATIC "Link to the libesmtp static library" OFF)
+if(LOG4CXX_ENABLE_ESMTP)
+    find_package(ESMTP)
+    if(ESMTP_FOUND)
+       set(HAS_LIBESMTP 1)
+    else()
+       set(HAS_LIBESMTP 0)
+       message(SEND_ERROR "libesmtp not found but SMTP support requested")
+    endif(ESMTP_FOUND)
+  else()
+    set(ESMTP_LIBRARIES )
+    set(HAS_LIBESMTP 0)
+endif(LOG4CXX_ENABLE_ESMTP)
+
 find_package(fmt 7.1 QUIET)
 if(${fmt_FOUND})
     option(ENABLE_FMT_LAYOUT "Enable the FMT layout(if libfmt found)" ON)
@@ -269,8 +284,6 @@ message(STATUS "  log4cxx cfstring API ............ : ${LOG4CXX_CFSTRING}")
 endif()
 message(STATUS "  logchar type .................... : ${LOG4CXX_CHAR}")
 message(STATUS "  charset ......................... : ${LOG4CXX_CHARSET}")
-message(STATUS "  Using libESMTP .................. : ${HAS_LIBESMTP}")
-message(STATUS "  ODBC library .................... : ${HAS_ODBC}")
 message(STATUS "  syslog .......................... : ${HAS_SYSLOG}")
 message(STATUS "  Networking support .............. : ${LOG4CXX_NETWORKING_SUPPORT}")
 message(STATUS "  Qt support ...................... : ${LOG4CXX_QT_SUPPORT}")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 788320de..cfac9457 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -22,6 +22,10 @@ add_subdirectory(main)
 target_compile_definitions(log4cxx PRIVATE ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} )
 target_include_directories(log4cxx INTERFACE $<INSTALL_INTERFACE:include> PRIVATE ${APR_INCLUDE_DIR} ${APR_UTIL_INCLUDE_DIR})
 target_link_libraries(log4cxx PRIVATE ${APR_UTIL_LIBRARIES} ${EXPAT_LIBRARIES} ${APR_LIBRARIES} ${APR_SYSTEM_LIBS})
+if(HAS_LIBESMTP)
+  target_include_directories(log4cxx PRIVATE ${ESMTP_INCLUDE_DIR})
+  target_link_libraries(log4cxx PRIVATE ${ESMTP_LIBRARIES})
+endif()
 if(WIN32)
 	# The ODBC appender is always enabled in the Windows configuration
 	target_link_libraries(log4cxx PRIVATE odbc32.lib)
diff --git a/src/cmake/FindESMTP.cmake b/src/cmake/FindESMTP.cmake
new file mode 100644
index 00000000..8919a036
--- /dev/null
+++ b/src/cmake/FindESMTP.cmake
@@ -0,0 +1,72 @@
+# Locate libesmtp include paths and libraries
+include(FindPackageHandleStandardArgs)
+
+# This module defines
+# ESMTP_INCLUDE_DIR, where to find libesmtp.h, etc.
+# ESMTP_LIBRARIES, the libraries to link against to use libesmtp.
+# ESMTP_FOUND, set to 'yes' if found
+macro(_esmtp_invoke _varname)
+    execute_process(
+        COMMAND ${_esmtp_CONFIG_EXECUTABLE} ${ARGN}
+        OUTPUT_VARIABLE _esmtp_output
+        RESULT_VARIABLE _esmtp_failed
+    )
+
+    if(_esmtp_failed)
+        message(FATAL_ERROR "${_esmtp_CONFIG_EXECUTABLE} ${ARGN} failed with result ${_esmtp_failed}")
+    else()
+        string(REGEX REPLACE "[\r\n]"  "" _esmtp_output "${_esmtp_output}")
+        string(REGEX REPLACE " +$"     "" _esmtp_output "${_esmtp_output}")
+        string(REGEX REPLACE "^ +"     "" _esmtp_output "${_esmtp_output}")
+
+        separate_arguments(_esmtp_output)
+        set(${_varname} "${_esmtp_output}")
+    endif(_esmtp_failed)
+endmacro(_esmtp_invoke)
+
+if(NOT LIBESMTP_STATIC) # libesmtp-config does not support --static used in FindPkgConfig.cmake
+find_package(PkgConfig)
+pkg_check_modules(esmtp esmtp)
+#message("esmtp_FOUND=${esmtp_FOUND}")
+endif()
+
+if(esmtp_FOUND)
+  find_path(ESMTP_INCLUDE_DIR
+            NAMES libesmtp.h
+            HINTS ${ESMTP_INCLUDE_DIRS}
+            PATH_SUFFIXES esmtp)
+  if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS)
+    set(ESMTP_LIBRARIES ${LIBESMTP_STATIC_LINK_LIBRARIES})
+  else()
+    set(ESMTP_LIBRARIES ${ESMTP_LINK_LIBRARIES})
+  endif()
+else()
+  find_program(_esmtp_CONFIG_EXECUTABLE
+      libesmtp-config
+      PATHS /usr/local/opt/libesmtp/bin    $ENV{ProgramFiles}/esmtp/bin
+      )
+  mark_as_advanced(_esmtp_CONFIG_EXECUTABLE)
+  if(EXISTS ${_esmtp_CONFIG_EXECUTABLE})
+      _esmtp_invoke(_esmtp_cflags_args  --cflags)
+      #message("_esmtp_cflags_args=${_esmtp_cflags_args}")
+      string(REGEX MATCH "-I([^ ;]+)" _esmtp_include_flag "${_esmtp_cflags_args}")
+      set(ESMTP_INCLUDE_DIR  "${CMAKE_MATCH_1}")
+      if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS)
+        find_library(ESMTP_LIBRARIES NAMES libesmtp.a)
+      else()
+        _esmtp_invoke(ESMTP_LIBRARIES  --libs)
+      endif()
+  else()
+      find_path(ESMTP_INCLUDE_DIR libesmtp.h PATH_SUFFIXES esmtp)
+      if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS)
+        find_library(ESMTP_LIBRARIES NAMES libesmtp.a)
+      else()
+        find_library(ESMTP_LIBRARIES NAMES esmtp)
+      endif()
+  endif()
+endif()
+
+#message("ESMTP_INCLUDE_DIR=${ESMTP_INCLUDE_DIR}")
+#message("ESMTP_LIBRARIES=${ESMTP_LIBRARIES}")
+find_package_handle_standard_args(ESMTP
+    ESMTP_INCLUDE_DIR ESMTP_LIBRARIES)
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 29f7aea4..861b98f4 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -279,11 +279,11 @@ AppenderPtr DOMConfigurator::parseAppender(Pool& p,
 				}
 				else
 				{
-					log4cxx::net::SMTPAppenderPtr smtpa = log4cxx::cast<log4cxx::net::SMTPAppender>(appender);
+					auto smtpa = log4cxx::cast<log4cxx::net::SMTPAppender>(appender);
 
 					if (smtpa != NULL)
 					{
-						log4cxx::spi::TriggeringEventEvaluatorPtr evaluator = log4cxx::cast<TriggeringEventEvaluator>(policyPtr);
+						auto evaluator = log4cxx::cast<TriggeringEventEvaluator>(policy);
 						smtpa->setEvaluator(evaluator);
 					}
 				}
diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp
index b295c1cf..47f4bfe8 100644
--- a/src/main/cpp/smtpappender.cpp
+++ b/src/main/cpp/smtpappender.cpp
@@ -19,6 +19,7 @@
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/helpers/optionconverter.h>
 #include <log4cxx/spi/loggingevent.h>
+#include <log4cxx/private/string_c11.h>
 #include <log4cxx/helpers/stringhelper.h>
 #include <log4cxx/helpers/stringtokenizer.h>
 #include <log4cxx/helpers/transcoder.h>
@@ -192,7 +193,7 @@ class SMTPMessage
 			const LogString msg, Pool& p)
 		{
 			message = smtp_add_message(session);
-			current_len = str.length();
+			current_len = msg.length();
 			body = current = toMessage(msg, p);
 			messagecbState = 0;
 			smtp_set_reverse_path(message, toAscii(from, p));
@@ -676,23 +677,23 @@ bool SMTPAppender::checkEntryConditions()
 {
 #if LOG4CXX_HAVE_LIBESMTP
 
-	if ((to.empty() && cc.empty() && bcc.empty()) || from.empty() || smtpHost.empty())
+	if ((_priv->to.empty() && _priv->cc.empty() && _priv->bcc.empty()) || _priv->from.empty() || _priv->smtpHost.empty())
 	{
-		errorHandler->error(LOG4CXX_STR("Message not configured."));
+		_priv->errorHandler->error(LOG4CXX_STR("Message not configured."));
 		return false;
 	}
 
-	if (evaluator == 0)
+	if (_priv->evaluator == 0)
 	{
-		errorHandler->error(LOG4CXX_STR("No TriggeringEventEvaluator is set for appender [") +
-			name + LOG4CXX_STR("]."));
+		_priv->errorHandler->error(LOG4CXX_STR("No TriggeringEventEvaluator is set for appender [") +
+			_priv->name + LOG4CXX_STR("]."));
 		return false;
 	}
 
 
-	if (layout == 0)
+	if (_priv->layout == 0)
 	{
-		errorHandler->error(LOG4CXX_STR("No layout set for appender named [") + name + LOG4CXX_STR("]."));
+		_priv->errorHandler->error(LOG4CXX_STR("No layout set for appender named [") + _priv->name + LOG4CXX_STR("]."));
 		return false;
 	}
 
@@ -751,22 +752,22 @@ void SMTPAppender::sendBuffer(Pool& p)
 	try
 	{
 		LogString sbuf;
-		layout->appendHeader(sbuf, p);
+		_priv->layout->appendHeader(sbuf, p);
 
-		int len = cb.length();
+		int len = _priv->cb.length();
 
 		for (int i = 0; i < len; i++)
 		{
-			LoggingEventPtr event = cb.get();
-			layout->format(sbuf, event, p);
+			LoggingEventPtr event = _priv->cb.get();
+			_priv->layout->format(sbuf, event, p);
 		}
 
-		layout->appendFooter(sbuf, p);
+		_priv->layout->appendFooter(sbuf, p);
 
-		SMTPSession session(smtpHost, smtpPort, smtpUsername, smtpPassword, p);
+		SMTPSession session(_priv->smtpHost, _priv->smtpPort, _priv->smtpUsername, _priv->smtpPassword, p);
 
-		SMTPMessage message(session, from, to, cc,
-			bcc, subject, sbuf, p);
+		SMTPMessage message(session, _priv->from, _priv->to, _priv->cc,
+			_priv->bcc, _priv->subject, sbuf, p);
 
 		session.send(p);
 
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index 4b142fdc..b0c524ff 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -128,16 +128,6 @@ else()
     set(HAS_ODBC 0)
 endif(LOG4CXX_ENABLE_ODBC)
 
-option(LOG4CXX_ENABLE_ESMTP "Support logging via libesmtp" OFF)
-if(LOG4CXX_ENABLE_ESMTP)
-    CHECK_LIBRARY_EXISTS(esmtp smtp_create_session "" HAS_LIBESMTP)
-    if(NOT HAS_LIBESMTP)
-        message(SEND_ERROR "SMTP support with libesmtp not found but requested")
-    endif()
-else()
-    set(HAS_LIBESMTP 0)
-endif(LOG4CXX_ENABLE_ESMTP)
-
 CHECK_INCLUDE_FILE_CXX(locale HAS_STD_LOCALE)
 CHECK_FUNCTION_EXISTS(mbsrtowcs HAS_MBSRTOWCS)
 CHECK_FUNCTION_EXISTS(wcstombs HAS_WCSTOMBS)
diff --git a/src/main/include/log4cxx/net/smtpappender.h b/src/main/include/log4cxx/net/smtpappender.h
index d181027d..f61125ed 100644
--- a/src/main/include/log4cxx/net/smtpappender.h
+++ b/src/main/include/log4cxx/net/smtpappender.h
@@ -28,14 +28,62 @@ namespace log4cxx
 namespace net
 {
 /**
-Send an e-mail when a specific logging event occurs, typically on
-errors or fatal errors.
-<p>The number of logging events delivered in this e-mail depend on
-the value of <b>BufferSize</b> option. The
-<code>SMTPAppender</code> keeps only the last
-<code>BufferSize</code> logging events in its cyclic buffer. This
-keeps memory requirements at a reasonable level while still
-delivering useful application context.
+Send an e-mail when a specific logging event occurs, typically when
+an <b>ERROR</b> level logging event is sent to the appender.
+
+A value must be provided for the following <b>param</b> elements :
+- <b>smtpHost</b> -
+  The URL or IP address of the SMTP server.
+- <b>from</b> -
+  The email address in the <b>from</b> field of the message.
+- one of <b>to</b>, <b>cc</b>, <b>bcc</b> -
+  An email address in the message.
+  
+The following <b>param</b> elements  are optional:
+- <b>smtpPort</b> -
+  The TCP/IP port number on the SMTP server.
+  By default port 25 is assumed.
+- <b>subject</b> -
+  Content for the the <b>subject</b> field of the message.
+- <b>smtpUsername</b> -
+  Provided when the SMTP server requests authentication.
+- <b>smtpPassword</b> -
+  Provided when the SMTP server requests authentication.
+- <b>BufferSize</b> -
+  The number of logging events delivered in an e-mail.
+  The <code>SMTPAppender</code> keeps only the last
+  <code>BufferSize</code> logging events in its cyclic buffer. This
+  keeps memory requirements at a reasonable level while still
+  delivering useful application context.
+  By default 512 logging events are kept in its cyclic buffer.
+- <b>evaluatorClass</b> -
+  The registered spi::TriggeringEventEvaluator sub-class
+  that provides the <code>isTriggeringEvent</code> implementation.
+  This attribute can also be set using the <b>triggeringPolicy</b> element.
+  By default an email is sent
+  when the level of the logging event
+  is greater or equal to <b>ERROR</b>.
+
+  An example configuration is:
+~~~{.xml}
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+  <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender">
+    <param name="from"   value="service_name@example.org" />
+    <param name="to" value="some_support_group@example.org" />
+    <param name="subject" value="Service error detected" />
+    <param name="SMTPHost" value="smtp.example.com"/>
+    <layout class="org.apache.log4j.PatternLayout">
+		<param name="ConversionPattern" value="%-5p %c{2} - %m%n"/>
+    </layout>
+    <!-- triggeringPolicy class="SpecialTriggeringEventEvaluator" -->
+    <!-- param name="evaluatorClass" value="SpecialTriggeringEventEvaluator" -->
+  </appender>
+  <root>
+    <priority value ="INFO" />
+    <appender-ref ref="EMAIL" />
+  </root>
+</log4j:configuration>
+~~~
 */
 class LOG4CXX_EXPORT SMTPAppender : public AppenderSkeleton
 {
diff --git a/src/main/include/log4cxx/private/string_c11.h b/src/main/include/log4cxx/private/string_c11.h
index f7182454..4c5a1b44 100644
--- a/src/main/include/log4cxx/private/string_c11.h
+++ b/src/main/include/log4cxx/private/string_c11.h
@@ -24,7 +24,7 @@
 #include <limits.h>
 #if !defined(RSIZE_MAX) && defined(SSIZE_MAX)
 #define RSIZE_MAX (SSIZE_MAX >> 4)
-#else !defined(RSIZE_MAX)
+#else // !defined(RSIZE_MAX)
 #define RSIZE_MAX (2 << 20)
 #endif
 
diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index 751abf8c..35f1cf2d 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -107,6 +107,9 @@ foreach(testName IN LISTS ALL_LOG4CXX_TESTS)
     target_compile_definitions(${testName} PRIVATE ${TEST_COMPILE_DEFINITIONS} ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} )
     target_include_directories(${testName} PRIVATE ${CMAKE_CURRENT_LIST_DIR} $<TARGET_PROPERTY:log4cxx,INCLUDE_DIRECTORIES>)
     target_link_libraries(${testName} PRIVATE testingFramework testingUtilities log4cxx ${APR_LIBRARIES} ${APR_SYSTEM_LIBS} Threads::Threads)
+    if(HAS_LIBESMTP)
+      target_link_libraries(${testName} PRIVATE ${ESMTP_LIBRARIES})
+    endif()
     add_test(NAME ${testName}
         COMMAND ${testName} -v
         WORKING_DIRECTORY ${UNIT_TEST_WORKING_DIR}
diff --git a/src/test/cpp/net/CMakeLists.txt b/src/test/cpp/net/CMakeLists.txt
index 32e8a17a..224e1140 100644
--- a/src/test/cpp/net/CMakeLists.txt
+++ b/src/test/cpp/net/CMakeLists.txt
@@ -26,9 +26,9 @@ else()
     set(NET_TESTS "")
 endif()
 
-if(HAS_LIBESMPT)
+if(HAS_LIBESMTP)
     list(APPEND NET_TESTS smtpappendertestcase)
-endif(HAS_LIBESMPT)
+endif(HAS_LIBESMTP)
 foreach(fileName IN LISTS NET_TESTS)
     add_executable(${fileName} "${fileName}.cpp")
 endforeach()
diff --git a/src/test/cpp/net/smtpappendertestcase.cpp b/src/test/cpp/net/smtpappendertestcase.cpp
index a3ba3770..9fb8d2dc 100644
--- a/src/test/cpp/net/smtpappendertestcase.cpp
+++ b/src/test/cpp/net/smtpappendertestcase.cpp
@@ -18,19 +18,11 @@
 #define LOG4CXX_TEST 1
 #include <log4cxx/private/log4cxx_private.h>
 
-#if LOG4CXX_HAVE_SMTP
-
 #include <log4cxx/net/smtpappender.h>
 #include "../appenderskeletontestcase.h"
 #include <log4cxx/xml/domconfigurator.h>
 #include <log4cxx/logmanager.h>
-#include <log4cxx/ttcclayout.h>
-
-using namespace log4cxx;
-using namespace log4cxx::helpers;
-using namespace log4cxx::net;
-using namespace log4cxx::xml;
-using namespace log4cxx::spi;
+#include <log4cxx/simplelayout.h>
 
 namespace log4cxx
 {
@@ -38,8 +30,7 @@ namespace net
 {
 
 class MockTriggeringEventEvaluator :
-	public virtual spi::TriggeringEventEvaluator,
-	public virtual helpers::ObjectImpl
+	public virtual spi::TriggeringEventEvaluator
 {
 	public:
 		DECLARE_LOG4CXX_OBJECT(MockTriggeringEventEvaluator)
@@ -63,6 +54,10 @@ class MockTriggeringEventEvaluator :
 }
 }
 
+using namespace log4cxx;
+using namespace log4cxx::helpers;
+using namespace log4cxx::net;
+
 IMPLEMENT_LOG4CXX_OBJECT(MockTriggeringEventEvaluator)
 
 
@@ -79,6 +74,7 @@ class SMTPAppenderTestCase : public AppenderSkeletonTestCase
 		LOGUNIT_TEST(testSetOptionThreshold);
 		LOGUNIT_TEST(testTrigger);
 		LOGUNIT_TEST(testInvalid);
+		//LOGUNIT_TEST(testValid);
 		LOGUNIT_TEST_SUITE_END();
 
 
@@ -103,29 +99,38 @@ class SMTPAppenderTestCase : public AppenderSkeletonTestCase
 		 */
 		void testTrigger()
 		{
-			DOMConfigurator::configure("input/xml/smtpAppender1.xml");
-			SMTPAppenderPtr appender(Logger::getRootLogger()->getAppender(LOG4CXX_STR("A1")));
-			TriggeringEventEvaluatorPtr evaluator(appender->getEvaluator());
+			xml::DOMConfigurator::configure("input/xml/smtpAppender1.xml");
+			auto appender = log4cxx::cast<SMTPAppender>(Logger::getRootLogger()->getAppender(LOG4CXX_STR("A1")));
+			LOGUNIT_ASSERT(appender);
+			auto evaluator = appender->getEvaluator();
+			LOGUNIT_ASSERT(evaluator);
 			LOGUNIT_ASSERT_EQUAL(true, evaluator->instanceof(MockTriggeringEventEvaluator::getStaticClass()));
 		}
 
 		void testInvalid()
 		{
-			SMTPAppenderPtr appender(new SMTPAppender());
+			auto appender = std::make_shared<SMTPAppender>();
 			appender->setSMTPHost(LOG4CXX_STR("smtp.invalid"));
 			appender->setTo(LOG4CXX_STR("you@example.invalid"));
 			appender->setFrom(LOG4CXX_STR("me@example.invalid"));
-			appender->setLayout(new TTCCLayout());
+			appender->setLayout(std::make_shared<SimpleLayout>());
 			Pool p;
 			appender->activateOptions(p);
-			LoggerPtr root(Logger::getRootLogger());
+			auto root = Logger::getRootLogger();
 			root->addAppender(appender);
-			LOG4CXX_INFO(root, "Hello, World.")
-			LOG4CXX_ERROR(root, "Sending Message")
+			LOG4CXX_INFO(root, "Hello, World.");
+			LOG4CXX_ERROR(root, "Sending Message");
 		}
 
+
+		void testValid()
+		{
+			xml::DOMConfigurator::configure("input/xml/smtpAppenderValid.xml");
+			auto root = Logger::getRootLogger();
+			LOG4CXX_INFO(root, "Hello, World.");
+			LOG4CXX_ERROR(root, "Sending Message");
+		}
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(SMTPAppenderTestCase);
 
-#endif