You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2014/05/24 18:52:58 UTC
svn commit: r1597320 - in /logging/log4j/log4j2/trunk/log4j-core/src:
main/java/org/apache/logging/log4j/core/impl/
test/java/org/apache/logging/log4j/core/impl/
Author: rpopma
Date: Sat May 24 16:52:58 2014
New Revision: 1597320
URL: http://svn.apache.org/r1597320
Log:
bugfix in fix for LOG4J2-250: made Throwable field in Log4jLogEvent.LogEventProxy transient to avoid regression on LOG4J2-542, added tests
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java?rev=1597320&r1=1597319&r2=1597320&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java Sat May 24 16:52:58 2014
@@ -500,7 +500,7 @@ public class Log4jLogEvent implements Lo
private final String loggerName;
private final Message message;
private final long timeMillis;
- private final Throwable thrown;
+ private final transient Throwable thrown;
private final ThrowableProxy thrownProxy;
private final Map<String, String> contextMap;
private final ThreadContext.ContextStack contextStack;
Modified: logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java?rev=1597320&r1=1597319&r2=1597320&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java Sat May 24 16:52:58 2014
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.im
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -25,49 +26,51 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.util.Clock;
import org.apache.logging.log4j.core.util.ClockFactory;
+import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.Strings;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import sun.misc.BASE64Decoder;
+
import static org.junit.Assert.*;
public class Log4jLogEventTest {
-
+
/** Helper class */
public static class FixedTimeClock implements Clock {
public static final long FIXED_TIME = 1234567890L;
- /* (non-Javadoc)
+
+ /*
+ * (non-Javadoc)
+ *
* @see org.apache.logging.log4j.core.helpers.Clock#currentTimeMillis()
*/
@Override
public long currentTimeMillis() {
return FIXED_TIME;
- }
+ }
}
+
@BeforeClass
public static void beforeClass() {
System.setProperty(ClockFactory.PROPERTY_NAME, FixedTimeClock.class.getName());
}
-
+
@AfterClass
public static void afterClass() {
System.clearProperty(ClockFactory.PROPERTY_NAME);
}
-
+
@Test
public void testJavaIoSerializable() throws Exception {
- final Log4jLogEvent evt = new Log4jLogEvent("some.test", null, Strings.EMPTY,
- Level.INFO, new SimpleMessage("abc"), null);
+ final Log4jLogEvent evt = new Log4jLogEvent("some.test", null, Strings.EMPTY, Level.INFO, new SimpleMessage(
+ "abc"), null);
- final ByteArrayOutputStream arr = new ByteArrayOutputStream();
- final ObjectOutputStream out = new ObjectOutputStream(arr);
- out.writeObject(evt);
-
- final ByteArrayInputStream inArr = new ByteArrayInputStream(arr.toByteArray());
- final ObjectInputStream in = new ObjectInputStream(inArr);
- final Log4jLogEvent evt2 = (Log4jLogEvent) in.readObject();
+ byte[] binary = serialize(evt);
+ final Log4jLogEvent evt2 = deserialize(binary);
assertEquals(evt.getTimeMillis(), evt2.getTimeMillis());
assertEquals(evt.getLoggerFqcn(), evt2.getLoggerFqcn());
@@ -83,20 +86,15 @@ public class Log4jLogEventTest {
assertEquals(evt.isEndOfBatch(), evt2.isEndOfBatch());
assertEquals(evt.isIncludeLocation(), evt2.isIncludeLocation());
}
-
+
@Test
public void testJavaIoSerializableWithThrown() throws Exception {
final Error thrown = new InternalError("test error");
- final Log4jLogEvent evt = new Log4jLogEvent("some.test", null, Strings.EMPTY,
- Level.INFO, new SimpleMessage("abc"), thrown);
+ final Log4jLogEvent evt = new Log4jLogEvent("some.test", null, Strings.EMPTY, Level.INFO, new SimpleMessage(
+ "abc"), thrown);
- final ByteArrayOutputStream arr = new ByteArrayOutputStream();
- final ObjectOutputStream out = new ObjectOutputStream(arr);
- out.writeObject(evt);
-
- final ByteArrayInputStream inArr = new ByteArrayInputStream(arr.toByteArray());
- final ObjectInputStream in = new ObjectInputStream(inArr);
- final Log4jLogEvent evt2 = (Log4jLogEvent) in.readObject();
+ byte[] binary = serialize(evt);
+ final Log4jLogEvent evt2 = deserialize(binary);
assertEquals(evt.getTimeMillis(), evt2.getTimeMillis());
assertEquals(evt.getLoggerFqcn(), evt2.getLoggerFqcn());
@@ -108,20 +106,166 @@ public class Log4jLogEventTest {
assertEquals(evt.getMessage(), evt2.getMessage());
assertEquals(evt.getSource(), evt2.getSource());
assertEquals(evt.getThreadName(), evt2.getThreadName());
- assertEquals(evt.getThrown().getClass(), evt2.getThrown().getClass());
- assertEquals(evt.getThrown().getMessage(), evt2.getThrown().getMessage());
+ assertNull(evt2.getThrown());
+ assertNotNull(evt2.getThrownProxy());
assertEquals(evt.getThrownProxy(), evt2.getThrownProxy());
assertEquals(evt.isEndOfBatch(), evt2.isEndOfBatch());
assertEquals(evt.isIncludeLocation(), evt2.isIncludeLocation());
}
+ private byte[] serialize(Log4jLogEvent event) throws IOException {
+ final ByteArrayOutputStream arr = new ByteArrayOutputStream();
+ final ObjectOutputStream out = new ObjectOutputStream(arr);
+ out.writeObject(event);
+ return arr.toByteArray();
+ }
+
+ private Log4jLogEvent deserialize(byte[] binary) throws IOException, ClassNotFoundException {
+ final ByteArrayInputStream inArr = new ByteArrayInputStream(binary);
+ final ObjectInputStream in = new ObjectInputStream(inArr);
+ final Log4jLogEvent result = (Log4jLogEvent) in.readObject();
+ return result;
+ }
+
+ // DO NOT REMOVE THIS COMMENT:
+ // UNCOMMENT WHEN GENERATING SERIALIZED EVENT FOR #testJavaIoSerializableWithUnknownThrowable
+ // public static class DeletedException extends Exception {
+ // private static final long serialVersionUID = 1L;
+ // public DeletedException(String msg) {
+ // super(msg);
+ // }
+ // };
+
+ @Test
+ public void testJavaIoSerializableWithUnknownThrowable() throws Exception {
+ final String loggerName = "some.test";
+ final Marker marker = null;
+ final String loggerFQN = Strings.EMPTY;
+ final Level level = Level.INFO;
+ final Message msg = new SimpleMessage("abc");
+ final String threadName = Thread.currentThread().getName();
+ final String errorMessage = "OMG I've been deleted!";
+
+ // DO NOT DELETE THIS COMMENT:
+ // UNCOMMENT TO RE-GENERATE SERIALIZED EVENT WHEN UPDATING THIS TEST.
+ // final Exception thrown = new DeletedException(errorMessage);
+ // final Log4jLogEvent evt = new Log4jLogEvent(loggerName, marker, loggerFQN, level, msg, thrown);
+ // final byte[] binary = serialize(evt);
+ //
+ // String base64 = new BASE64Encoder().encode(binary);
+ // System.out.println("final String base64 = \"" + base64.replaceAll("\r\n", "\\\\r\\\\n\" +\r\n\"") + "\";");
+
+ final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQk\r\n"
+ + "TG9nRXZlbnRQcm94eZztD11w2ioWAgAOWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVp\r\n"
+ + "cmVkSgAKdGltZU1pbGxpc0wACmNvbnRleHRNYXB0AA9MamF2YS91dGlsL01hcDtMAAxjb250ZXh0\r\n"
+ + "U3RhY2t0ADVMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL1RocmVhZENvbnRleHQkQ29udGV4dFN0\r\n"
+ + "YWNrO0wABWxldmVsdAAgTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9MZXZlbDtMAApsb2dnZXJG\r\n"
+ + "UUNOdAASTGphdmEvbGFuZy9TdHJpbmc7TAAKbG9nZ2VyTmFtZXEAfgAETAAGbWFya2VydAAhTG9y\r\n"
+ + "Zy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9NYXJrZXI7TAAHbWVzc2FnZXQAKkxvcmcvYXBhY2hlL2xv\r\n"
+ + "Z2dpbmcvbG9nNGovbWVzc2FnZS9NZXNzYWdlO0wABnNvdXJjZXQAHUxqYXZhL2xhbmcvU3RhY2tU\r\n"
+ + "cmFjZUVsZW1lbnQ7TAAKdGhyZWFkTmFtZXEAfgAETAAGdGhyb3dudAAVTGphdmEvbGFuZy9UaHJv\r\n"
+ + "d2FibGU7TAALdGhyb3duUHJveHl0ADNMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1w\r\n"
+ + "bC9UaHJvd2FibGVQcm94eTt4cAAAAAAAAEmWAtJzcgAeamF2YS51dGlsLkNvbGxlY3Rpb25zJEVt\r\n"
+ + "cHR5TWFwWTYUhVrc59ACAAB4cHNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouVGhyZWFkQ29u\r\n"
+ + "dGV4dCRFbXB0eVRocmVhZENvbnRleHRTdGFjawAAAAAAAAABAgAAeHBzcgAeb3JnLmFwYWNoZS5s\r\n"
+ + "b2dnaW5nLmxvZzRqLkxldmVsAAAAAAAYIBoCAANJAAhpbnRMZXZlbEwABG5hbWVxAH4ABEwADXN0\r\n"
+ + "YW5kYXJkTGV2ZWx0ACxMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL3NwaS9TdGFuZGFyZExldmVs\r\n"
+ + "O3hwAAABkHQABElORk9+cgAqb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLnNwaS5TdGFuZGFyZExl\r\n"
+ + "dmVsAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAESU5GT3QAAHQA\r\n"
+ + "CXNvbWUudGVzdHBzcgAub3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLm1lc3NhZ2UuU2ltcGxlTWVz\r\n"
+ + "c2FnZYt0TTBgt6KoAgABTAAHbWVzc2FnZXEAfgAEeHB0AANhYmNwdAAEbWFpbnNyAEVvcmcuYXBh\r\n"
+ + "Y2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0JERlbGV0ZWRFeGNl\r\n"
+ + "cHRpb24AAAAAAAAAAQIAAHhyABNqYXZhLmxhbmcuRXhjZXB0aW9u0P0fPho7HMQCAAB4cgATamF2\r\n"
+ + "YS5sYW5nLlRocm93YWJsZdXGNSc5d7jLAwADTAAFY2F1c2VxAH4ACEwADWRldGFpbE1lc3NhZ2Vx\r\n"
+ + "AH4ABFsACnN0YWNrVHJhY2V0AB5bTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDt4cHEAfgAh\r\n"
+ + "dAAWT01HIEkndmUgYmVlbiBkZWxldGVkIXVyAB5bTGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVu\r\n"
+ + "dDsCRio8PP0iOQIAAHhwAAAAGnNyABtqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRhCcWaJjbd\r\n"
+ + "hQIABEkACmxpbmVOdW1iZXJMAA5kZWNsYXJpbmdDbGFzc3EAfgAETAAIZmlsZU5hbWVxAH4ABEwA\r\n"
+ + "Cm1ldGhvZE5hbWVxAH4ABHhwAAAAl3QANG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmlt\r\n"
+ + "cGwuTG9nNGpMb2dFdmVudFRlc3R0ABZMb2c0akxvZ0V2ZW50VGVzdC5qYXZhdAAqdGVzdEphdmFJ\r\n"
+ + "b1NlcmlhbGl6YWJsZVdpdGhVbmtub3duVGhyb3dhYmxlc3EAfgAl/////nQAJHN1bi5yZWZsZWN0\r\n"
+ + "Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHQAHU5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZh\r\n"
+ + "dAAHaW52b2tlMHNxAH4AJQAAACdxAH4AK3EAfgAsdAAGaW52b2tlc3EAfgAlAAAAGXQAKHN1bi5y\r\n"
+ + "ZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGx0ACFEZWxlZ2F0aW5nTWV0aG9kQWNj\r\n"
+ + "ZXNzb3JJbXBsLmphdmFxAH4AL3NxAH4AJQAAAlV0ABhqYXZhLmxhbmcucmVmbGVjdC5NZXRob2R0\r\n"
+ + "AAtNZXRob2QuamF2YXEAfgAvc3EAfgAlAAAAL3QAKW9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZy\r\n"
+ + "YW1ld29ya01ldGhvZCQxdAAURnJhbWV3b3JrTWV0aG9kLmphdmF0ABFydW5SZWZsZWN0aXZlQ2Fs\r\n"
+ + "bHNxAH4AJQAAAAx0ADNvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5tb2RlbC5SZWZsZWN0aXZl\r\n"
+ + "Q2FsbGFibGV0ABdSZWZsZWN0aXZlQ2FsbGFibGUuamF2YXQAA3J1bnNxAH4AJQAAACx0ACdvcmcu\r\n"
+ + "anVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2RxAH4AOHQAEWludm9rZUV4cGxvc2l2\r\n"
+ + "ZWx5c3EAfgAlAAAAEXQAMm9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuSW52\r\n"
+ + "b2tlTWV0aG9kdAARSW52b2tlTWV0aG9kLmphdmF0AAhldmFsdWF0ZXNxAH4AJQAAAQ90AB5vcmcu\r\n"
+ + "anVuaXQucnVubmVycy5QYXJlbnRSdW5uZXJ0ABFQYXJlbnRSdW5uZXIuamF2YXQAB3J1bkxlYWZz\r\n"
+ + "cQB+ACUAAABGdAAob3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcnQAG0Js\r\n"
+ + "b2NrSlVuaXQ0Q2xhc3NSdW5uZXIuamF2YXQACHJ1bkNoaWxkc3EAfgAlAAAAMnEAfgBKcQB+AEtx\r\n"
+ + "AH4ATHNxAH4AJQAAAO50ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkM3EAfgBHcQB+\r\n"
+ + "AD1zcQB+ACUAAAA/dAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDFxAH4AR3QACHNj\r\n"
+ + "aGVkdWxlc3EAfgAlAAAA7HEAfgBGcQB+AEd0AAtydW5DaGlsZHJlbnNxAH4AJQAAADVxAH4ARnEA\r\n"
+ + "fgBHdAAKYWNjZXNzJDAwMHNxAH4AJQAAAOV0ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5u\r\n"
+ + "ZXIkMnEAfgBHcQB+AERzcQB+ACUAAAAadAAwb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3Rh\r\n"
+ + "dGVtZW50cy5SdW5CZWZvcmVzdAAPUnVuQmVmb3Jlcy5qYXZhcQB+AERzcQB+ACUAAAAbdAAvb3Jn\r\n"
+ + "Lmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5BZnRlcnN0AA5SdW5BZnRlcnMu\r\n"
+ + "amF2YXEAfgBEc3EAfgAlAAABNXEAfgBGcQB+AEdxAH4APXNxAH4AJQAAADJ0ADpvcmcuZWNsaXBz\r\n"
+ + "ZS5qZHQuaW50ZXJuYWwuanVuaXQ0LnJ1bm5lci5KVW5pdDRUZXN0UmVmZXJlbmNldAAYSlVuaXQ0\r\n"
+ + "VGVzdFJlZmVyZW5jZS5qYXZhcQB+AD1zcQB+ACUAAAAmdAAzb3JnLmVjbGlwc2UuamR0LmludGVy\r\n"
+ + "bmFsLmp1bml0LnJ1bm5lci5UZXN0RXhlY3V0aW9udAASVGVzdEV4ZWN1dGlvbi5qYXZhcQB+AD1z\r\n"
+ + "cQB+ACUAAAHTdAA2b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5SZW1vdGVU\r\n"
+ + "ZXN0UnVubmVydAAVUmVtb3RlVGVzdFJ1bm5lci5qYXZhdAAIcnVuVGVzdHNzcQB+ACUAAAKrcQB+\r\n"
+ + "AGdxAH4AaHEAfgBpc3EAfgAlAAABhnEAfgBncQB+AGhxAH4APXNxAH4AJQAAAMVxAH4AZ3EAfgBo\r\n"
+ + "dAAEbWFpbnhzcgAxb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5UaHJvd2FibGVQ\r\n"
+ + "cm94ednMMNWae6z6AgAHSQASY29tbW9uRWxlbWVudENvdW50TAAKY2F1c2VQcm94eXEAfgAJWwAS\r\n"
+ + "ZXh0ZW5kZWRTdGFja1RyYWNldAA/W0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBs\r\n"
+ + "L0V4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnQ7TAAQbG9jYWxpemVkTWVzc2FnZXEAfgAETAAHbWVz\r\n"
+ + "c2FnZXEAfgAETAAEbmFtZXEAfgAEWwARc3VwcHJlc3NlZFByb3hpZXN0ADRbTG9yZy9hcGFjaGUv\r\n"
+ + "bG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7eHAAAAAAcHVyAD9bTG9yZy5h\r\n"
+ + "cGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudDvK\r\n"
+ + "z4gjpcfPvAIAAHhwAAAAGnNyADxvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkV4\r\n"
+ + "dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnTh3s+6xraQBwIAAkwADmV4dHJhQ2xhc3NJbmZvdAA2TG9y\r\n"
+ + "Zy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvRXh0ZW5kZWRDbGFzc0luZm87TAARc3Rh\r\n"
+ + "Y2tUcmFjZUVsZW1lbnRxAH4AB3hwc3IANG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmlt\r\n"
+ + "cGwuRXh0ZW5kZWRDbGFzc0luZm8AAAAAAAAAAQIAA1oABWV4YWN0TAAIbG9jYXRpb25xAH4ABEwA\r\n"
+ + "B3ZlcnNpb25xAH4ABHhwAXQADXRlc3QtY2xhc3Nlcy90AAE/cQB+ACZzcQB+AHRzcQB+AHcAcQB+\r\n"
+ + "AHp0AAgxLjYuMF80NXEAfgAqc3EAfgB0c3EAfgB3AHEAfgB6cQB+AH1xAH4ALnNxAH4AdHNxAH4A\r\n"
+ + "dwBxAH4AenEAfgB9cQB+ADBzcQB+AHRzcQB+AHcAcQB+AHpxAH4AfXEAfgAzc3EAfgB0c3EAfgB3\r\n"
+ + "AXQADmp1bml0LTQuMTEuamFycQB+AHpxAH4ANnNxAH4AdHNxAH4AdwF0AA5qdW5pdC00LjExLmph\r\n"
+ + "cnEAfgB6cQB+ADpzcQB+AHRzcQB+AHcBdAAOanVuaXQtNC4xMS5qYXJxAH4AenEAfgA+c3EAfgB0\r\n"
+ + "c3EAfgB3AXQADmp1bml0LTQuMTEuamFycQB+AHpxAH4AQXNxAH4AdHNxAH4AdwF0AA5qdW5pdC00\r\n"
+ + "LjExLmphcnEAfgB6cQB+AEVzcQB+AHRzcQB+AHcBdAAOanVuaXQtNC4xMS5qYXJxAH4AenEAfgBJ\r\n"
+ + "c3EAfgB0c3EAfgB3AXQADmp1bml0LTQuMTEuamFycQB+AHpxAH4ATXNxAH4AdHNxAH4AdwF0AA5q\r\n"
+ + "dW5pdC00LjExLmphcnEAfgB6cQB+AE5zcQB+AHRzcQB+AHcBdAAOanVuaXQtNC4xMS5qYXJxAH4A\r\n"
+ + "enEAfgBQc3EAfgB0c3EAfgB3AXQADmp1bml0LTQuMTEuamFycQB+AHpxAH4AU3NxAH4AdHNxAH4A\r\n"
+ + "dwF0AA5qdW5pdC00LjExLmphcnEAfgB6cQB+AFVzcQB+AHRzcQB+AHcBdAAOanVuaXQtNC4xMS5q\r\n"
+ + "YXJxAH4AenEAfgBXc3EAfgB0c3EAfgB3AXQADmp1bml0LTQuMTEuamFycQB+AHpxAH4AWXNxAH4A\r\n"
+ + "dHNxAH4AdwF0AA5qdW5pdC00LjExLmphcnEAfgB6cQB+AFxzcQB+AHRzcQB+AHcBdAAOanVuaXQt\r\n"
+ + "NC4xMS5qYXJxAH4AenEAfgBfc3EAfgB0c3EAfgB3AXQABC5jcC9xAH4AenEAfgBgc3EAfgB0c3EA\r\n"
+ + "fgB3AXQABC5jcC9xAH4AenEAfgBjc3EAfgB0c3EAfgB3AXQABC5jcC9xAH4AenEAfgBmc3EAfgB0\r\n"
+ + "c3EAfgB3AXQABC5jcC9xAH4AenEAfgBqc3EAfgB0c3EAfgB3AXQABC5jcC9xAH4AenEAfgBrc3EA\r\n"
+ + "fgB0c3EAfgB3AXQABC5jcC9xAH4AenEAfgBscQB+ACJxAH4AInQARW9yZy5hcGFjaGUubG9nZ2lu\r\n"
+ + "Zy5sb2c0ai5jb3JlLmltcGwuTG9nNGpMb2dFdmVudFRlc3QkRGVsZXRlZEV4Y2VwdGlvbnVyADRb\r\n"
+ + "TG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dhYmxlUHJveHk7+u0B4IWi\r\n"
+ + "6zkCAAB4cAAAAAA=";
+
+ byte[] binaryDecoded = new BASE64Decoder().decodeBuffer(base64);
+ final Log4jLogEvent evt2 = deserialize(binaryDecoded);
+
+ assertEquals(loggerFQN, evt2.getLoggerFqcn());
+ assertEquals(level, evt2.getLevel());
+ assertEquals(loggerName, evt2.getLoggerName());
+ assertEquals(marker, evt2.getMarker());
+ assertEquals(msg, evt2.getMessage());
+ assertEquals(threadName, evt2.getThreadName());
+ assertEquals(null, evt2.getThrown());
+ assertEquals(this.getClass().getName() + "$DeletedException", evt2.getThrownProxy().getName());
+ assertEquals(errorMessage, evt2.getThrownProxy().getMessage());
+ }
+
@Test
public void testNullLevelReplacedWithOFF() throws Exception {
final Marker marker = null;
final Throwable t = null;
final Level NULL_LEVEL = null;
- final Log4jLogEvent evt = new Log4jLogEvent("some.test", marker, Strings.EMPTY,
- NULL_LEVEL, new SimpleMessage("abc"), t);
+ final Log4jLogEvent evt = new Log4jLogEvent("some.test", marker, Strings.EMPTY, NULL_LEVEL, new SimpleMessage(
+ "abc"), t);
assertEquals(Level.OFF, evt.getLevel());
}
@@ -130,9 +274,9 @@ public class Log4jLogEventTest {
final Marker marker = null;
final Throwable t = null;
final Level NULL_LEVEL = null;
- final Log4jLogEvent evt = new Log4jLogEvent("some.test", marker, Strings.EMPTY,
- NULL_LEVEL, new SimpleMessage("abc"), t);
+ final Log4jLogEvent evt = new Log4jLogEvent("some.test", marker, Strings.EMPTY, NULL_LEVEL, new SimpleMessage(
+ "abc"), t);
assertEquals(FixedTimeClock.FIXED_TIME, evt.getTimeMillis());
-
+
}
}
Modified: logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java?rev=1597320&r1=1597319&r2=1597320&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java (original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java Sat May 24 16:52:58 2014
@@ -16,18 +16,25 @@
*/
package org.apache.logging.log4j.core.impl;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
-import org.junit.Assert;
import org.junit.Test;
+import sun.misc.BASE64Decoder;
+
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
+import static org.junit.Assert.*;
+
/**
*
*/
@@ -44,12 +51,12 @@ public class ThrowableProxyTest {
Fixture expected = new Fixture();
final String s = objectMapper.writeValueAsString(expected);
Fixture actual = objectMapper.readValue(s, Fixture.class);
- Assert.assertEquals(expected.proxy.getName(), actual.proxy.getName());
- Assert.assertEquals(expected.proxy.getMessage(), actual.proxy.getMessage());
- Assert.assertEquals(expected.proxy.getLocalizedMessage(), actual.proxy.getLocalizedMessage());
- Assert.assertEquals(expected.proxy.getCommonElementCount(), actual.proxy.getCommonElementCount());
- Assert.assertArrayEquals(expected.proxy.getExtendedStackTrace(), actual.proxy.getExtendedStackTrace());
- Assert.assertEquals(expected.proxy, actual.proxy);
+ assertEquals(expected.proxy.getName(), actual.proxy.getName());
+ assertEquals(expected.proxy.getMessage(), actual.proxy.getMessage());
+ assertEquals(expected.proxy.getLocalizedMessage(), actual.proxy.getLocalizedMessage());
+ assertEquals(expected.proxy.getCommonElementCount(), actual.proxy.getCommonElementCount());
+ assertArrayEquals(expected.proxy.getExtendedStackTrace(), actual.proxy.getExtendedStackTrace());
+ assertEquals(expected.proxy, actual.proxy);
}
@Test
@@ -60,6 +67,124 @@ public class ThrowableProxyTest {
final ThrowableProxy proxy = new ThrowableProxy(throwable);
final ExtendedStackTraceElement[] callerPackageData = proxy.toExtendedStackTrace(stack, map, null,
throwable.getStackTrace());
- Assert.assertNotNull("No package data returned", callerPackageData);
+ assertNotNull("No package data returned", callerPackageData);
+ }
+
+ @Test
+ public void testSerialization() throws Exception {
+ final Throwable throwable = new IllegalArgumentException("This is a test");
+ final ThrowableProxy proxy = new ThrowableProxy(throwable);
+ final byte[] binary = serialize(proxy);
+ final ThrowableProxy proxy2 = deserialize(binary);
+
+ assertEquals(proxy.getName(), proxy2.getName());
+ assertEquals(proxy.getMessage(), proxy2.getMessage());
+ assertEquals(proxy.getCauseProxy(), proxy2.getCauseProxy());
+ assertArrayEquals(proxy.getExtendedStackTrace(), proxy2.getExtendedStackTrace());
+ }
+
+ // DO NOT REMOVE THIS COMMENT:
+ // UNCOMMENT WHEN GENERATING SERIALIZED THROWABLEPROXY FOR #testSerializationWithUnknownThrowable
+ // public static class DeletedException extends Exception {
+ // private static final long serialVersionUID = 1L;
+ //
+ // public DeletedException(String msg) {
+ // super(msg);
+ // }
+ // };
+
+ @Test
+ public void testSerializationWithUnknownThrowable() throws Exception {
+
+ final String msg = "OMG I've been deleted!";
+
+ // DO NOT DELETE THIS COMMENT:
+ // UNCOMMENT TO RE-GENERATE SERIALIZED EVENT WHEN UPDATING THIS TEST.
+ // final Exception thrown = new DeletedException(msg);
+ // final ThrowableProxy proxy = new ThrowableProxy(thrown);
+ // final byte[] binary = serialize(proxy);
+ // String base64 = new BASE64Encoder().encode(binary);
+ // System.out.println("final String base64 = \"" + base64.replaceAll("\r\n", "\\\\r\\\\n\" +\r\n\"") + "\";");
+
+ final String base64 = "rO0ABXNyADFvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZVByb3h5\r\n" +
+ "2cww1Zp7rPoCAAdJABJjb21tb25FbGVtZW50Q291bnRMAApjYXVzZVByb3h5dAAzTG9yZy9hcGFj\r\n" +
+ "aGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7WwASZXh0ZW5kZWRTdGFj\r\n" +
+ "a1RyYWNldAA/W0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL0V4dGVuZGVkU3Rh\r\n" +
+ "Y2tUcmFjZUVsZW1lbnQ7TAAQbG9jYWxpemVkTWVzc2FnZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wA\r\n" +
+ "B21lc3NhZ2VxAH4AA0wABG5hbWVxAH4AA1sAEXN1cHByZXNzZWRQcm94aWVzdAA0W0xvcmcvYXBh\r\n" +
+ "Y2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL1Rocm93YWJsZVByb3h5O3hwAAAAAHB1cgA/W0xv\r\n" +
+ "cmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkV4dGVuZGVkU3RhY2tUcmFjZUVsZW1l\r\n" +
+ "bnQ7ys+II6XHz7wCAAB4cAAAABhzcgA8b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1w\r\n" +
+ "bC5FeHRlbmRlZFN0YWNrVHJhY2VFbGVtZW504d7Pusa2kAcCAAJMAA5leHRyYUNsYXNzSW5mb3QA\r\n" +
+ "NkxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL0V4dGVuZGVkQ2xhc3NJbmZvO0wA\r\n" +
+ "EXN0YWNrVHJhY2VFbGVtZW50dAAdTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDt4cHNyADRv\r\n" +
+ "cmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkV4dGVuZGVkQ2xhc3NJbmZvAAAAAAAA\r\n" +
+ "AAECAANaAAVleGFjdEwACGxvY2F0aW9ucQB+AANMAAd2ZXJzaW9ucQB+AAN4cAF0AA10ZXN0LWNs\r\n" +
+ "YXNzZXMvdAABP3NyABtqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRhCcWaJjbdhQIABEkACmxp\r\n" +
+ "bmVOdW1iZXJMAA5kZWNsYXJpbmdDbGFzc3EAfgADTAAIZmlsZU5hbWVxAH4AA0wACm1ldGhvZE5h\r\n" +
+ "bWVxAH4AA3hwAAAAaHQANW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dh\r\n" +
+ "YmxlUHJveHlUZXN0dAAXVGhyb3dhYmxlUHJveHlUZXN0LmphdmF0ACV0ZXN0U2VyaWFsaXphdGlv\r\n" +
+ "bldpdGhVbmtub3duVGhyb3dhYmxlc3EAfgAIc3EAfgAMAHEAfgAPdAAIMS42LjBfNDVzcQB+ABD/\r\n" +
+ "///+dAAkc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsdAAdTmF0aXZlTWV0aG9k\r\n" +
+ "QWNjZXNzb3JJbXBsLmphdmF0AAdpbnZva2Uwc3EAfgAIc3EAfgAMAHEAfgAPcQB+ABdzcQB+ABAA\r\n" +
+ "AAAncQB+ABlxAH4AGnQABmludm9rZXNxAH4ACHNxAH4ADABxAH4AD3EAfgAXc3EAfgAQAAAAGXQA\r\n" +
+ "KHN1bi5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGx0ACFEZWxlZ2F0aW5nTWV0\r\n" +
+ "aG9kQWNjZXNzb3JJbXBsLmphdmFxAH4AH3NxAH4ACHNxAH4ADABxAH4AD3EAfgAXc3EAfgAQAAAC\r\n" +
+ "VXQAGGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZHQAC01ldGhvZC5qYXZhcQB+AB9zcQB+AAhzcQB+\r\n" +
+ "AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAAC90AClvcmcuanVuaXQucnVubmVycy5t\r\n" +
+ "b2RlbC5GcmFtZXdvcmtNZXRob2QkMXQAFEZyYW1ld29ya01ldGhvZC5qYXZhdAARcnVuUmVmbGVj\r\n" +
+ "dGl2ZUNhbGxzcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAAAx0ADNv\r\n" +
+ "cmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5tb2RlbC5SZWZsZWN0aXZlQ2FsbGFibGV0ABdSZWZs\r\n" +
+ "ZWN0aXZlQ2FsbGFibGUuamF2YXQAA3J1bnNxAH4ACHNxAH4ADAF0AA5qdW5pdC00LjExLmphcnEA\r\n" +
+ "fgAPc3EAfgAQAAAALHQAJ29yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZHEA\r\n" +
+ "fgAvdAARaW52b2tlRXhwbG9zaXZlbHlzcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4A\r\n" +
+ "D3NxAH4AEAAAABF0ADJvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLkludm9r\r\n" +
+ "ZU1ldGhvZHQAEUludm9rZU1ldGhvZC5qYXZhdAAIZXZhbHVhdGVzcQB+AAhzcQB+AAwBdAAOanVu\r\n" +
+ "aXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAAQ90AB5vcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5u\r\n" +
+ "ZXJ0ABFQYXJlbnRSdW5uZXIuamF2YXQAB3J1bkxlYWZzcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4x\r\n" +
+ "MS5qYXJxAH4AD3NxAH4AEAAAAEZ0AChvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNz\r\n" +
+ "UnVubmVydAAbQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5qYXZhdAAIcnVuQ2hpbGRzcQB+AAhzcQB+\r\n" +
+ "AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAADJxAH4AUHEAfgBRcQB+AFJzcQB+AAhz\r\n" +
+ "cQB+AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAAO50ACBvcmcuanVuaXQucnVubmVy\r\n" +
+ "cy5QYXJlbnRSdW5uZXIkM3EAfgBKcQB+ADdzcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4xMS5qYXJx\r\n" +
+ "AH4AD3NxAH4AEAAAAD90ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMXEAfgBKdAAI\r\n" +
+ "c2NoZWR1bGVzcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3NxAH4AEAAAAOxxAH4A\r\n" +
+ "SXEAfgBKdAALcnVuQ2hpbGRyZW5zcQB+AAhzcQB+AAwBdAAOanVuaXQtNC4xMS5qYXJxAH4AD3Nx\r\n" +
+ "AH4AEAAAADVxAH4ASXEAfgBKdAAKYWNjZXNzJDAwMHNxAH4ACHNxAH4ADAF0AA5qdW5pdC00LjEx\r\n" +
+ "LmphcnEAfgAPc3EAfgAQAAAA5XQAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQycQB+\r\n" +
+ "AEpxAH4ARHNxAH4ACHNxAH4ADAF0AA5qdW5pdC00LjExLmphcnEAfgAPc3EAfgAQAAABNXEAfgBJ\r\n" +
+ "cQB+AEpxAH4AN3NxAH4ACHNxAH4ADAF0AAQuY3AvcQB+AA9zcQB+ABAAAAAydAA6b3JnLmVjbGlw\r\n" +
+ "c2UuamR0LmludGVybmFsLmp1bml0NC5ydW5uZXIuSlVuaXQ0VGVzdFJlZmVyZW5jZXQAGEpVbml0\r\n" +
+ "NFRlc3RSZWZlcmVuY2UuamF2YXEAfgA3c3EAfgAIc3EAfgAMAXQABC5jcC9xAH4AD3NxAH4AEAAA\r\n" +
+ "ACZ0ADNvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLlRlc3RFeGVjdXRpb250\r\n" +
+ "ABJUZXN0RXhlY3V0aW9uLmphdmFxAH4AN3NxAH4ACHNxAH4ADAF0AAQuY3AvcQB+AA9zcQB+ABAA\r\n" +
+ "AAHTdAA2b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5SZW1vdGVUZXN0UnVu\r\n" +
+ "bmVydAAVUmVtb3RlVGVzdFJ1bm5lci5qYXZhdAAIcnVuVGVzdHNzcQB+AAhzcQB+AAwBdAAELmNw\r\n" +
+ "L3EAfgAPc3EAfgAQAAACq3EAfgCFcQB+AIZxAH4Ah3NxAH4ACHNxAH4ADAF0AAQuY3AvcQB+AA9z\r\n" +
+ "cQB+ABAAAAGGcQB+AIVxAH4AhnEAfgA3c3EAfgAIc3EAfgAMAXQABC5jcC9xAH4AD3NxAH4AEAAA\r\n" +
+ "AMVxAH4AhXEAfgCGdAAEbWFpbnQAFk9NRyBJJ3ZlIGJlZW4gZGVsZXRlZCFxAH4AlXQARm9yZy5h\r\n" +
+ "cGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dhYmxlUHJveHlUZXN0JERlbGV0ZWRF\r\n" +
+ "eGNlcHRpb251cgA0W0xvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJs\r\n" +
+ "ZVByb3h5O/rtAeCFous5AgAAeHAAAAAA";
+
+
+ byte[] binaryDecoded = new BASE64Decoder().decodeBuffer(base64);
+ final ThrowableProxy proxy2 = deserialize(binaryDecoded);
+
+ assertEquals(this.getClass().getName() + "$DeletedException", proxy2.getName());
+ assertEquals(msg, proxy2.getMessage());
+ }
+
+ private byte[] serialize(ThrowableProxy proxy) throws IOException {
+ final ByteArrayOutputStream arr = new ByteArrayOutputStream();
+ final ObjectOutputStream out = new ObjectOutputStream(arr);
+ out.writeObject(proxy);
+ return arr.toByteArray();
+ }
+
+ private ThrowableProxy deserialize(byte[] binary) throws IOException, ClassNotFoundException {
+ final ByteArrayInputStream inArr = new ByteArrayInputStream(binary);
+ final ObjectInputStream in = new ObjectInputStream(inArr);
+ return (ThrowableProxy) in.readObject();
}
}