LOG4J2-2428: pass the event handler defined on the factory to the events
diff --git a/log4j-audit/log4j-audit-api/src/main/java/org/apache/logging/log4j/audit/LogEventFactory.java b/log4j-audit/log4j-audit-api/src/main/java/org/apache/logging/log4j/audit/LogEventFactory.java
index 5657bf4..8746209 100644
--- a/log4j-audit/log4j-audit-api/src/main/java/org/apache/logging/log4j/audit/LogEventFactory.java
+++ b/log4j-audit/log4j-audit-api/src/main/java/org/apache/logging/log4j/audit/LogEventFactory.java
@@ -248,7 +248,7 @@
private final AuditMessage msg;
private final Class<?> intrface;
- private AuditExceptionHandler auditExceptionHandler = DEFAULT_HANDLER;
+ private AuditExceptionHandler auditExceptionHandler = defaultExceptionHandler;
AuditProxy(AuditMessage msg, Class<?> intrface) {
this.msg = msg;
diff --git a/log4j-audit/log4j-audit-api/src/test/java/org/apache/logging/log4j/audit/TransferTest.java b/log4j-audit/log4j-audit-api/src/test/java/org/apache/logging/log4j/audit/TransferTest.java
index 3a8c628..7e920cc 100644
--- a/log4j-audit/log4j-audit-api/src/test/java/org/apache/logging/log4j/audit/TransferTest.java
+++ b/log4j-audit/log4j-audit-api/src/test/java/org/apache/logging/log4j/audit/TransferTest.java
@@ -21,25 +21,32 @@
import java.util.List;
import java.util.Map;
+import org.apache.commons.lang3.mutable.MutableBoolean;
import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.audit.event.Transfer;
+import org.apache.logging.log4j.audit.exception.AuditException;
import org.apache.logging.log4j.audit.exception.ConstraintValidationException;
import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.Before;
-import org.junit.BeforeClass;
+import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.config.AbstractConfiguration;
+import org.apache.logging.log4j.test.appender.AlwaysFailAppender;
+import org.junit.Rule;
import org.junit.Test;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import org.junit.rules.ExpectedException;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
/**
*
*/
public class TransferTest extends BaseEventTest {
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
+ private final String failingAppenderName = "failingAppenderName";
@Test(expected = ConstraintValidationException.class)
public void testValidationFailureForMissingRequestContextAttribute() {
@@ -103,13 +110,71 @@
}
List<String> msgs = app.getMessages();
assertNotNull("No messages", msgs);
- assertTrue("No messages", msgs.size() == 2);
+ assertEquals("No messages", 2, msgs.size());
String msg = msgs.get(0);
assertTrue("No companyId", msg.contains("companyId=\"12345\""));
assertTrue("No ipAddress", msg.contains("ipAddress=\"127.0.0.1\""));
assertTrue("No toAccount", msg.contains("toAccount=\"123456\""));
}
+ private AbstractConfiguration setUpFailingAppender() {
+ Logger auditLogger = (Logger) LogManager.getContext(false).getLogger("AuditLogger");
+ AbstractConfiguration config = (AbstractConfiguration) ctx.getConfiguration();
+
+ Appender appender = AlwaysFailAppender.createAppender(failingAppenderName);
+ appender.start();
+ config.addLoggerAppender(auditLogger, appender);
+
+ return config;
+ }
+
+ private Transfer setUpMinimumEvent() {
+ ThreadContext.put("accountNumber", "12345");
+ ThreadContext.put("userId", "JohnDoe");
+ ThreadContext.put("loginId", "TestUser");
+
+ Transfer transfer = LogEventFactory.getEvent(Transfer.class);
+ transfer.setToAccount(123456);
+ transfer.setFromAccount(111111);
+ transfer.setAmount(new BigDecimal(111.55));
+ return transfer;
+ }
+
+ @Test
+ public void testDefaultExceptionHandlerIsInvokedOnEventLogFailure() {
+ AbstractConfiguration config = setUpFailingAppender();
+
+ exception.expect(AuditException.class);
+ exception.expectCause(isA(LoggingException.class));
+ exception.expectMessage("Error logging event transfer");
+
+ Transfer transfer = setUpMinimumEvent();
+ try {
+ transfer.logEvent();
+ } finally {
+ config.removeAppender(failingAppenderName);
+ }
+ }
+
+ @Test
+ public void testCustomExceptionHandlerIsPassedToEvent() {
+ AbstractConfiguration config = setUpFailingAppender();
+
+ MutableBoolean exceptionHandled = new MutableBoolean(false);
+ AuditExceptionHandler exceptionHandler = (message, ex) -> {
+ assertThat(ex, instanceOf(LoggingException.class));
+ exceptionHandled.setTrue();
+ };
+ LogEventFactory.setDefaultHandler(exceptionHandler);
+
+ Transfer transfer = setUpMinimumEvent();
+ transfer.logEvent();
+
+ assertTrue("Exception was not handled through the custom handler", exceptionHandled.isTrue());
+
+ config.removeAppender(failingAppenderName);
+ }
+
@Test(expected = ConstraintValidationException.class)
public void testAuditLogWithMissingRequestContextAttribute() {
ThreadContext.put("userId", "JohnDoe");
@@ -162,10 +227,10 @@
}
List<String> msgs = app.getMessages();
assertNotNull("No messages", msgs);
- assertTrue("No messages", msgs.size() == 1);
+ assertEquals("No messages", 1, msgs.size());
String msg = msgs.get(0);
assertTrue("No companyId", msg.contains("companyId=\"12345\""));
assertTrue("No ipAddress", msg.contains("ipAddress=\"127.0.0.1\""));
assertTrue("No toAccount", msg.contains("toAccount=\"123456\""));
}
-}
+}
\ No newline at end of file