You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/03/08 17:35:50 UTC
[10/10] logging-log4j2 git commit: Unit test for GelfLayout.encode
Unit test for GelfLayout.encode
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/58152b79
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/58152b79
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/58152b79
Branch: refs/heads/gelf-layout-gc-free
Commit: 58152b79b0c883ba6df57b06bbb4e2c96353232e
Parents: 7467e5d
Author: Mikael Ståldal <mi...@magine.com>
Authored: Tue Mar 8 17:34:43 2016 +0100
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Tue Mar 8 17:34:43 2016 +0100
----------------------------------------------------------------------
.../log4j/core/layout/GelfLayoutTest.java | 75 +++++++++++---------
.../test/appender/EncodingListAppender.java | 64 +++++++++++++++++
.../log4j/test/appender/ListAppender.java | 9 ++-
3 files changed, 112 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
index 2aa7eda..c82fa21 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
@@ -16,32 +16,28 @@
*/
package org.apache.logging.log4j.core.layout;
-import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.InflaterInputStream;
-
+import com.fasterxml.jackson.core.io.JsonStringEncoder;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.BasicConfigurationFactory;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.*;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.layout.GelfLayout.CompressionType;
import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.test.appender.EncodingListAppender;
import org.apache.logging.log4j.test.appender.ListAppender;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import com.fasterxml.jackson.core.io.JsonStringEncoder;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.InflaterInputStream;
+
+import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
public class GelfLayoutTest {
static ConfigurationFactory configFactory = new BasicConfigurationFactory();
@@ -85,18 +81,20 @@ public class GelfLayoutTest {
final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new KeyValuePair[] {
new KeyValuePair(KEY1, VALUE1),
new KeyValuePair(KEY2, VALUE2), }, compressionType, 1024);
- // ConsoleAppender appender = new ConsoleAppender("Console", layout);
final ListAppender eventAppender = new ListAppender("Events", null, null, true, false);
final ListAppender rawAppender = new ListAppender("Raw", null, layout, true, true);
final ListAppender formattedAppender = new ListAppender("Formatted", null, layout, true, false);
+ final EncodingListAppender encodedAppender = new EncodingListAppender("Encoded", null, layout, false, true);
eventAppender.start();
rawAppender.start();
formattedAppender.start();
+ encodedAppender.start();
// set appenders on root and set level to debug
root.addAppender(eventAppender);
root.addAppender(rawAppender);
root.addAppender(formattedAppender);
+ root.addAppender(encodedAppender);
root.setLevel(Level.DEBUG);
root.debug(LINE1);
@@ -116,6 +114,7 @@ public class GelfLayoutTest {
final List<LogEvent> events = eventAppender.getEvents();
final List<byte[]> raw = rawAppender.getData();
final List<String> messages = formattedAppender.getMessages();
+ final List<byte[]> raw2 = encodedAppender.getData();
final String threadName = Thread.currentThread().getName();
//@formatter:off
@@ -148,42 +147,52 @@ public class GelfLayoutTest {
messages.get(1));
//@formatter:on
final byte[] compressed = raw.get(2);
+ final byte[] compressed2 = raw2.get(2);
final ByteArrayInputStream bais = new ByteArrayInputStream(compressed);
- InputStream inflaterStream = null;
+ final ByteArrayInputStream bais2 = new ByteArrayInputStream(compressed2);
+ InputStream inflaterStream;
+ InputStream inflaterStream2;
switch (compressionType) {
case GZIP:
inflaterStream = new GZIPInputStream(bais);
+ inflaterStream2 = new GZIPInputStream(bais2);
break;
case ZLIB:
inflaterStream = new InflaterInputStream(bais);
+ inflaterStream2 = new InflaterInputStream(bais2);
break;
case OFF:
inflaterStream = bais;
+ inflaterStream2 = bais2;
break;
default:
throw new IllegalStateException("Missing test case clause");
}
final byte[] uncompressed = IOUtils.toByteArray(inflaterStream);
+ final byte[] uncompressed2 = IOUtils.toByteArray(inflaterStream2);
inflaterStream.close();
+ inflaterStream2.close();
final String uncompressedString = new String(uncompressed, layout.getCharset());
+ final String uncompressedString2 = new String(uncompressed2, layout.getCharset());
//@formatter:off
- assertJsonEquals("{" +
- "\"version\": \"1.1\"," +
- "\"host\": \"" + HOSTNAME + "\"," +
- "\"timestamp\": " + GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
- "\"level\": 3," +
- "\"_thread\": \"" + threadName + "\"," +
- "\"_logger\": \"\"," +
- "\"short_message\": \"" + LINE3 + "\"," +
- "\"full_message\": \"" + String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
- GelfLayout.formatThrowable(exception))) + "\"," +
- "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
- "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
- "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
- "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
- "}",
- uncompressedString);
+ String expected = "{" +
+ "\"version\": \"1.1\"," +
+ "\"host\": \"" + HOSTNAME + "\"," +
+ "\"timestamp\": " + GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
+ "\"level\": 3," +
+ "\"_thread\": \"" + threadName + "\"," +
+ "\"_logger\": \"\"," +
+ "\"short_message\": \"" + LINE3 + "\"," +
+ "\"full_message\": \"" + String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
+ GelfLayout.formatThrowable(exception))) + "\"," +
+ "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
+ "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
+ "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
+ "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
+ "}";
//@formatter:on
+ assertJsonEquals(expected, uncompressedString);
+ assertJsonEquals(expected, uncompressedString2);
}
@Test
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
new file mode 100644
index 0000000..810e18f
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
@@ -0,0 +1,64 @@
+package org.apache.logging.log4j.test.appender;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.layout.SerializedLayout;
+
+import java.io.Serializable;
+import java.nio.ByteBuffer;
+
+/**
+ * This appender is primarily used for testing. Use in a real environment is discouraged as the
+ * List could eventually grow to cause an OutOfMemoryError.
+ *
+ * This appender will use {@link Layout#encode(Object, ByteBufferDestination)} (and not {@link Layout#toByteArray(LogEvent)}).
+ */
+public class EncodingListAppender extends ListAppender {
+
+ public EncodingListAppender(String name) {
+ super(name);
+ }
+
+ public EncodingListAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean newline, boolean raw) {
+ super(name, filter, layout, newline, raw);
+ }
+
+ private class Destination implements ByteBufferDestination {
+ ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[4096]);
+ @Override
+ public ByteBuffer getByteBuffer() {
+ return byteBuffer;
+ }
+
+ @Override
+ public ByteBuffer drain(final ByteBuffer buf) {
+ throw new IllegalStateException("Unexpected message larger than 4096 bytes");
+ }
+ }
+
+ @Override
+ public synchronized void append(final LogEvent event) {
+ final Layout<? extends Serializable> layout = getLayout();
+ if (layout == null) {
+ events.add(event);
+ } else if (layout instanceof SerializedLayout) {
+ Destination content = new Destination();
+ content.byteBuffer.put(layout.getHeader());
+ layout.encode(event, content);
+ content.getByteBuffer().rewind();
+ byte[] record = new byte[content.getByteBuffer().remaining()];
+ content.getByteBuffer().get(record);
+ data.add(record);
+ } else {
+ Destination content = new Destination();
+ layout.encode(event, content);
+ content.getByteBuffer().rewind();
+ byte[] record = new byte[content.getByteBuffer().remaining()];
+ content.getByteBuffer().get(record);
+ write(record);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
index 05fa157..cd9ec82 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
@@ -36,6 +36,9 @@ import org.apache.logging.log4j.core.layout.SerializedLayout;
/**
* This appender is primarily used for testing. Use in a real environment is discouraged as the
* List could eventually grow to cause an OutOfMemoryError.
+ *
+ * This appender will use {@link Layout#toByteArray(LogEvent)}.
+ *
* @see org.apache.logging.log4j.junit.LoggerContextRule#getListAppender(String) ILC.getListAppender
*/
@Plugin(name = "List", category = "Core", elementType = "appender", printObject = true)
@@ -45,11 +48,11 @@ public class ListAppender extends AbstractAppender {
// Use CopyOnWriteArrayList?
- private final List<LogEvent> events = new ArrayList<>();
+ final List<LogEvent> events = new ArrayList<>();
private final List<String> messages = new ArrayList<>();
- private final List<byte[]> data = new ArrayList<>();
+ final List<byte[]> data = new ArrayList<>();
private final boolean newLine;
@@ -93,7 +96,7 @@ public class ListAppender extends AbstractAppender {
}
}
- private void write(final byte[] bytes) {
+ void write(final byte[] bytes) {
if (raw) {
data.add(bytes);
return;
Re: [10/10] logging-log4j2 git commit: Unit test for GelfLayout.encode
Posted by Mikael Ståldal <mi...@magine.com>.
Thanks, fixed now.
On Tue, Mar 8, 2016 at 10:13 PM, Remko Popma <re...@gmail.com> wrote:
>
>
> On Wed, Mar 9, 2016 at 3:35 AM, <mi...@apache.org> wrote:
>
>> Unit test for GelfLayout.encode
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>> Commit:
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/58152b79
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/58152b79
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/58152b79
>>
>> Branch: refs/heads/gelf-layout-gc-free
>> Commit: 58152b79b0c883ba6df57b06bbb4e2c96353232e
>> Parents: 7467e5d
>> Author: Mikael Ståldal <mi...@magine.com>
>> Authored: Tue Mar 8 17:34:43 2016 +0100
>> Committer: Mikael Ståldal <mi...@magine.com>
>> Committed: Tue Mar 8 17:34:43 2016 +0100
>>
>> ----------------------------------------------------------------------
>> .../log4j/core/layout/GelfLayoutTest.java | 75 +++++++++++---------
>> .../test/appender/EncodingListAppender.java | 64 +++++++++++++++++
>> .../log4j/test/appender/ListAppender.java | 9 ++-
>> 3 files changed, 112 insertions(+), 36 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
>> index 2aa7eda..c82fa21 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
>> +++
>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
>> @@ -16,32 +16,28 @@
>> */
>> package org.apache.logging.log4j.core.layout;
>>
>> -import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
>> -
>> -import java.io.ByteArrayInputStream;
>> -import java.io.IOException;
>> -import java.io.InputStream;
>> -import java.util.List;
>> -import java.util.zip.GZIPInputStream;
>> -import java.util.zip.InflaterInputStream;
>> -
>> +import com.fasterxml.jackson.core.io.JsonStringEncoder;
>> import org.apache.commons.io.IOUtils;
>> import org.apache.logging.log4j.Level;
>> import org.apache.logging.log4j.ThreadContext;
>> -import org.apache.logging.log4j.core.Appender;
>> -import org.apache.logging.log4j.core.BasicConfigurationFactory;
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.Logger;
>> -import org.apache.logging.log4j.core.LoggerContext;
>> +import org.apache.logging.log4j.core.*;
>> import org.apache.logging.log4j.core.config.ConfigurationFactory;
>> import org.apache.logging.log4j.core.layout.GelfLayout.CompressionType;
>> import org.apache.logging.log4j.core.util.KeyValuePair;
>> +import org.apache.logging.log4j.test.appender.EncodingListAppender;
>> import org.apache.logging.log4j.test.appender.ListAppender;
>> import org.junit.AfterClass;
>> import org.junit.BeforeClass;
>> import org.junit.Test;
>>
>> -import com.fasterxml.jackson.core.io.JsonStringEncoder;
>> +import java.io.ByteArrayInputStream;
>> +import java.io.IOException;
>> +import java.io.InputStream;
>> +import java.util.List;
>> +import java.util.zip.GZIPInputStream;
>> +import java.util.zip.InflaterInputStream;
>> +
>> +import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
>>
>> public class GelfLayoutTest {
>> static ConfigurationFactory configFactory = new
>> BasicConfigurationFactory();
>> @@ -85,18 +81,20 @@ public class GelfLayoutTest {
>> final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new
>> KeyValuePair[] {
>> new KeyValuePair(KEY1, VALUE1),
>> new KeyValuePair(KEY2, VALUE2), }, compressionType,
>> 1024);
>> - // ConsoleAppender appender = new ConsoleAppender("Console",
>> layout);
>> final ListAppender eventAppender = new ListAppender("Events",
>> null, null, true, false);
>> final ListAppender rawAppender = new ListAppender("Raw", null,
>> layout, true, true);
>> final ListAppender formattedAppender = new
>> ListAppender("Formatted", null, layout, true, false);
>> + final EncodingListAppender encodedAppender = new
>> EncodingListAppender("Encoded", null, layout, false, true);
>> eventAppender.start();
>> rawAppender.start();
>> formattedAppender.start();
>> + encodedAppender.start();
>>
>> // set appenders on root and set level to debug
>> root.addAppender(eventAppender);
>> root.addAppender(rawAppender);
>> root.addAppender(formattedAppender);
>> + root.addAppender(encodedAppender);
>> root.setLevel(Level.DEBUG);
>>
>> root.debug(LINE1);
>> @@ -116,6 +114,7 @@ public class GelfLayoutTest {
>> final List<LogEvent> events = eventAppender.getEvents();
>> final List<byte[]> raw = rawAppender.getData();
>> final List<String> messages = formattedAppender.getMessages();
>> + final List<byte[]> raw2 = encodedAppender.getData();
>> final String threadName = Thread.currentThread().getName();
>>
>> //@formatter:off
>> @@ -148,42 +147,52 @@ public class GelfLayoutTest {
>> messages.get(1));
>> //@formatter:on
>> final byte[] compressed = raw.get(2);
>> + final byte[] compressed2 = raw2.get(2);
>> final ByteArrayInputStream bais = new
>> ByteArrayInputStream(compressed);
>> - InputStream inflaterStream = null;
>> + final ByteArrayInputStream bais2 = new
>> ByteArrayInputStream(compressed2);
>> + InputStream inflaterStream;
>> + InputStream inflaterStream2;
>> switch (compressionType) {
>> case GZIP:
>> inflaterStream = new GZIPInputStream(bais);
>> + inflaterStream2 = new GZIPInputStream(bais2);
>> break;
>> case ZLIB:
>> inflaterStream = new InflaterInputStream(bais);
>> + inflaterStream2 = new InflaterInputStream(bais2);
>> break;
>> case OFF:
>> inflaterStream = bais;
>> + inflaterStream2 = bais2;
>> break;
>> default:
>> throw new IllegalStateException("Missing test case clause");
>> }
>> final byte[] uncompressed = IOUtils.toByteArray(inflaterStream);
>> + final byte[] uncompressed2 =
>> IOUtils.toByteArray(inflaterStream2);
>> inflaterStream.close();
>> + inflaterStream2.close();
>> final String uncompressedString = new String(uncompressed,
>> layout.getCharset());
>> + final String uncompressedString2 = new String(uncompressed2,
>> layout.getCharset());
>> //@formatter:off
>> - assertJsonEquals("{" +
>> - "\"version\": \"1.1\"," +
>> - "\"host\": \"" + HOSTNAME + "\"," +
>> - "\"timestamp\": " +
>> GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
>> - "\"level\": 3," +
>> - "\"_thread\": \"" + threadName + "\"," +
>> - "\"_logger\": \"\"," +
>> - "\"short_message\": \"" + LINE3 + "\"," +
>> - "\"full_message\": \"" +
>> String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
>> - GelfLayout.formatThrowable(exception)))
>> + "\"," +
>> - "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
>> - "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
>> - "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
>> - "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
>> - "}",
>> - uncompressedString);
>> + String expected = "{" +
>> + "\"version\": \"1.1\"," +
>> + "\"host\": \"" + HOSTNAME + "\"," +
>> + "\"timestamp\": " +
>> GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
>> + "\"level\": 3," +
>> + "\"_thread\": \"" + threadName + "\"," +
>> + "\"_logger\": \"\"," +
>> + "\"short_message\": \"" + LINE3 + "\"," +
>> + "\"full_message\": \"" +
>> String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
>> + GelfLayout.formatThrowable(exception))) + "\"," +
>> + "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
>> + "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
>> + "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
>> + "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
>> + "}";
>> //@formatter:on
>> + assertJsonEquals(expected, uncompressedString);
>> + assertJsonEquals(expected, uncompressedString2);
>> }
>>
>> @Test
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
>> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
>> new file mode 100644
>> index 0000000..810e18f
>> --- /dev/null
>> +++
>> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
>> @@ -0,0 +1,64 @@
>> +package org.apache.logging.log4j.test.appender;
>> +
>> +import org.apache.logging.log4j.core.Filter;
>> +import org.apache.logging.log4j.core.Layout;
>> +import org.apache.logging.log4j.core.LogEvent;
>> +import org.apache.logging.log4j.core.layout.ByteBufferDestination;
>> +import org.apache.logging.log4j.core.layout.SerializedLayout;
>> +
>> +import java.io.Serializable;
>> +import java.nio.ByteBuffer;
>> +
>> +/**
>> + * This appender is primarily used for testing. Use in a real
>> environment is discouraged as the
>> + * List could eventually grow to cause an OutOfMemoryError.
>> + *
>> + * This appender will use {@link Layout#encode(Object,
>> ByteBufferDestination)} (and not {@link Layout#toByteArray(LogEvent)}).
>> + */
>> +public class EncodingListAppender extends ListAppender {
>> +
>> + public EncodingListAppender(String name) {
>> + super(name);
>> + }
>> +
>> + public EncodingListAppender(String name, Filter filter, Layout<?
>> extends Serializable> layout, boolean newline, boolean raw) {
>> + super(name, filter, layout, newline, raw);
>> + }
>> +
>> + private class Destination implements ByteBufferDestination {
>> + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[4096]);
>> + @Override
>> + public ByteBuffer getByteBuffer() {
>> + return byteBuffer;
>> + }
>> +
>> + @Override
>> + public ByteBuffer drain(final ByteBuffer buf) {
>> + throw new IllegalStateException("Unexpected message larger
>> than 4096 bytes");
>> + }
>> + }
>> +
>> + @Override
>> + public synchronized void append(final LogEvent event) {
>> + final Layout<? extends Serializable> layout = getLayout();
>> + if (layout == null) {
>> + events.add(event);
>> + } else if (layout instanceof SerializedLayout) {
>> + Destination content = new Destination();
>> + content.byteBuffer.put(layout.getHeader());
>> + layout.encode(event, content);
>> + content.getByteBuffer().rewind();
>> + byte[] record = new
>> byte[content.getByteBuffer().remaining()];
>> + content.getByteBuffer().get(record);
>> + data.add(record);
>>
> I think there is a bug here. ByteBuffer.rewind() does not change limit, it
> just sets the position back to zero. (Meaning you no longer know how many
> bytes were put into the buffer.) I believe you want to use
> ByteBuffer.flip() instead of rewind().
> If you use flip(), the limit is set to the current position before the
> position is reset to zero. After a flip(), the remaining() method will
> return the difference between the limit and the current position, which is
> what you want: the number of bytes you just wrote into the buffer.
>
>
>
>> + } else {
>> + Destination content = new Destination();
>> + layout.encode(event, content);
>> + content.getByteBuffer().rewind();
>> + byte[] record = new
>> byte[content.getByteBuffer().remaining()];
>> + content.getByteBuffer().get(record);
>> + write(record);
>> + }
>> + }
>> +
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
>> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
>> index 05fa157..cd9ec82 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
>> +++
>> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
>> @@ -36,6 +36,9 @@ import
>> org.apache.logging.log4j.core.layout.SerializedLayout;
>> /**
>> * This appender is primarily used for testing. Use in a real
>> environment is discouraged as the
>> * List could eventually grow to cause an OutOfMemoryError.
>> + *
>> + * This appender will use {@link Layout#toByteArray(LogEvent)}.
>> + *
>> * @see
>> org.apache.logging.log4j.junit.LoggerContextRule#getListAppender(String)
>> ILC.getListAppender
>> */
>> @Plugin(name = "List", category = "Core", elementType = "appender",
>> printObject = true)
>> @@ -45,11 +48,11 @@ public class ListAppender extends AbstractAppender {
>>
>> // Use CopyOnWriteArrayList?
>>
>> - private final List<LogEvent> events = new ArrayList<>();
>> + final List<LogEvent> events = new ArrayList<>();
>>
>> private final List<String> messages = new ArrayList<>();
>>
>> - private final List<byte[]> data = new ArrayList<>();
>> + final List<byte[]> data = new ArrayList<>();
>>
>> private final boolean newLine;
>>
>> @@ -93,7 +96,7 @@ public class ListAppender extends AbstractAppender {
>> }
>> }
>>
>> - private void write(final byte[] bytes) {
>> + void write(final byte[] bytes) {
>> if (raw) {
>> data.add(bytes);
>> return;
>>
>>
>
--
[image: MagineTV]
*Mikael Ståldal*
Senior software developer
*Magine TV*
mikael.staldal@magine.com
Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com
Privileged and/or Confidential Information may be contained in this
message. If you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not
copy or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply
email.
Re: [10/10] logging-log4j2 git commit: Unit test for GelfLayout.encode
Posted by Remko Popma <re...@gmail.com>.
On Wed, Mar 9, 2016 at 3:35 AM, <mi...@apache.org> wrote:
> Unit test for GelfLayout.encode
>
>
> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/58152b79
> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/58152b79
> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/58152b79
>
> Branch: refs/heads/gelf-layout-gc-free
> Commit: 58152b79b0c883ba6df57b06bbb4e2c96353232e
> Parents: 7467e5d
> Author: Mikael Ståldal <mi...@magine.com>
> Authored: Tue Mar 8 17:34:43 2016 +0100
> Committer: Mikael Ståldal <mi...@magine.com>
> Committed: Tue Mar 8 17:34:43 2016 +0100
>
> ----------------------------------------------------------------------
> .../log4j/core/layout/GelfLayoutTest.java | 75 +++++++++++---------
> .../test/appender/EncodingListAppender.java | 64 +++++++++++++++++
> .../log4j/test/appender/ListAppender.java | 9 ++-
> 3 files changed, 112 insertions(+), 36 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
> index 2aa7eda..c82fa21 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
> +++
> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
> @@ -16,32 +16,28 @@
> */
> package org.apache.logging.log4j.core.layout;
>
> -import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
> -
> -import java.io.ByteArrayInputStream;
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.util.List;
> -import java.util.zip.GZIPInputStream;
> -import java.util.zip.InflaterInputStream;
> -
> +import com.fasterxml.jackson.core.io.JsonStringEncoder;
> import org.apache.commons.io.IOUtils;
> import org.apache.logging.log4j.Level;
> import org.apache.logging.log4j.ThreadContext;
> -import org.apache.logging.log4j.core.Appender;
> -import org.apache.logging.log4j.core.BasicConfigurationFactory;
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.Logger;
> -import org.apache.logging.log4j.core.LoggerContext;
> +import org.apache.logging.log4j.core.*;
> import org.apache.logging.log4j.core.config.ConfigurationFactory;
> import org.apache.logging.log4j.core.layout.GelfLayout.CompressionType;
> import org.apache.logging.log4j.core.util.KeyValuePair;
> +import org.apache.logging.log4j.test.appender.EncodingListAppender;
> import org.apache.logging.log4j.test.appender.ListAppender;
> import org.junit.AfterClass;
> import org.junit.BeforeClass;
> import org.junit.Test;
>
> -import com.fasterxml.jackson.core.io.JsonStringEncoder;
> +import java.io.ByteArrayInputStream;
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.util.List;
> +import java.util.zip.GZIPInputStream;
> +import java.util.zip.InflaterInputStream;
> +
> +import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
>
> public class GelfLayoutTest {
> static ConfigurationFactory configFactory = new
> BasicConfigurationFactory();
> @@ -85,18 +81,20 @@ public class GelfLayoutTest {
> final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new
> KeyValuePair[] {
> new KeyValuePair(KEY1, VALUE1),
> new KeyValuePair(KEY2, VALUE2), }, compressionType, 1024);
> - // ConsoleAppender appender = new ConsoleAppender("Console",
> layout);
> final ListAppender eventAppender = new ListAppender("Events",
> null, null, true, false);
> final ListAppender rawAppender = new ListAppender("Raw", null,
> layout, true, true);
> final ListAppender formattedAppender = new
> ListAppender("Formatted", null, layout, true, false);
> + final EncodingListAppender encodedAppender = new
> EncodingListAppender("Encoded", null, layout, false, true);
> eventAppender.start();
> rawAppender.start();
> formattedAppender.start();
> + encodedAppender.start();
>
> // set appenders on root and set level to debug
> root.addAppender(eventAppender);
> root.addAppender(rawAppender);
> root.addAppender(formattedAppender);
> + root.addAppender(encodedAppender);
> root.setLevel(Level.DEBUG);
>
> root.debug(LINE1);
> @@ -116,6 +114,7 @@ public class GelfLayoutTest {
> final List<LogEvent> events = eventAppender.getEvents();
> final List<byte[]> raw = rawAppender.getData();
> final List<String> messages = formattedAppender.getMessages();
> + final List<byte[]> raw2 = encodedAppender.getData();
> final String threadName = Thread.currentThread().getName();
>
> //@formatter:off
> @@ -148,42 +147,52 @@ public class GelfLayoutTest {
> messages.get(1));
> //@formatter:on
> final byte[] compressed = raw.get(2);
> + final byte[] compressed2 = raw2.get(2);
> final ByteArrayInputStream bais = new
> ByteArrayInputStream(compressed);
> - InputStream inflaterStream = null;
> + final ByteArrayInputStream bais2 = new
> ByteArrayInputStream(compressed2);
> + InputStream inflaterStream;
> + InputStream inflaterStream2;
> switch (compressionType) {
> case GZIP:
> inflaterStream = new GZIPInputStream(bais);
> + inflaterStream2 = new GZIPInputStream(bais2);
> break;
> case ZLIB:
> inflaterStream = new InflaterInputStream(bais);
> + inflaterStream2 = new InflaterInputStream(bais2);
> break;
> case OFF:
> inflaterStream = bais;
> + inflaterStream2 = bais2;
> break;
> default:
> throw new IllegalStateException("Missing test case clause");
> }
> final byte[] uncompressed = IOUtils.toByteArray(inflaterStream);
> + final byte[] uncompressed2 = IOUtils.toByteArray(inflaterStream2);
> inflaterStream.close();
> + inflaterStream2.close();
> final String uncompressedString = new String(uncompressed,
> layout.getCharset());
> + final String uncompressedString2 = new String(uncompressed2,
> layout.getCharset());
> //@formatter:off
> - assertJsonEquals("{" +
> - "\"version\": \"1.1\"," +
> - "\"host\": \"" + HOSTNAME + "\"," +
> - "\"timestamp\": " +
> GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
> - "\"level\": 3," +
> - "\"_thread\": \"" + threadName + "\"," +
> - "\"_logger\": \"\"," +
> - "\"short_message\": \"" + LINE3 + "\"," +
> - "\"full_message\": \"" +
> String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
> - GelfLayout.formatThrowable(exception))) +
> "\"," +
> - "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
> - "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
> - "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
> - "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
> - "}",
> - uncompressedString);
> + String expected = "{" +
> + "\"version\": \"1.1\"," +
> + "\"host\": \"" + HOSTNAME + "\"," +
> + "\"timestamp\": " +
> GelfLayout.formatTimestamp(events.get(2).getTimeMillis()) + "," +
> + "\"level\": 3," +
> + "\"_thread\": \"" + threadName + "\"," +
> + "\"_logger\": \"\"," +
> + "\"short_message\": \"" + LINE3 + "\"," +
> + "\"full_message\": \"" +
> String.valueOf(JsonStringEncoder.getInstance().quoteAsString(
> + GelfLayout.formatThrowable(exception))) + "\"," +
> + "\"_" + KEY1 + "\": \"" + VALUE1 + "\"," +
> + "\"_" + KEY2 + "\": \"" + VALUE2 + "\"," +
> + "\"_" + MDCKEY1 + "\": \"" + MDCVALUE1 + "\"," +
> + "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
> + "}";
> //@formatter:on
> + assertJsonEquals(expected, uncompressedString);
> + assertJsonEquals(expected, uncompressedString2);
> }
>
> @Test
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
> new file mode 100644
> index 0000000..810e18f
> --- /dev/null
> +++
> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/EncodingListAppender.java
> @@ -0,0 +1,64 @@
> +package org.apache.logging.log4j.test.appender;
> +
> +import org.apache.logging.log4j.core.Filter;
> +import org.apache.logging.log4j.core.Layout;
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.layout.ByteBufferDestination;
> +import org.apache.logging.log4j.core.layout.SerializedLayout;
> +
> +import java.io.Serializable;
> +import java.nio.ByteBuffer;
> +
> +/**
> + * This appender is primarily used for testing. Use in a real environment
> is discouraged as the
> + * List could eventually grow to cause an OutOfMemoryError.
> + *
> + * This appender will use {@link Layout#encode(Object,
> ByteBufferDestination)} (and not {@link Layout#toByteArray(LogEvent)}).
> + */
> +public class EncodingListAppender extends ListAppender {
> +
> + public EncodingListAppender(String name) {
> + super(name);
> + }
> +
> + public EncodingListAppender(String name, Filter filter, Layout<?
> extends Serializable> layout, boolean newline, boolean raw) {
> + super(name, filter, layout, newline, raw);
> + }
> +
> + private class Destination implements ByteBufferDestination {
> + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[4096]);
> + @Override
> + public ByteBuffer getByteBuffer() {
> + return byteBuffer;
> + }
> +
> + @Override
> + public ByteBuffer drain(final ByteBuffer buf) {
> + throw new IllegalStateException("Unexpected message larger
> than 4096 bytes");
> + }
> + }
> +
> + @Override
> + public synchronized void append(final LogEvent event) {
> + final Layout<? extends Serializable> layout = getLayout();
> + if (layout == null) {
> + events.add(event);
> + } else if (layout instanceof SerializedLayout) {
> + Destination content = new Destination();
> + content.byteBuffer.put(layout.getHeader());
> + layout.encode(event, content);
> + content.getByteBuffer().rewind();
> + byte[] record = new byte[content.getByteBuffer().remaining()];
> + content.getByteBuffer().get(record);
> + data.add(record);
>
I think there is a bug here. ByteBuffer.rewind() does not change limit, it
just sets the position back to zero. (Meaning you no longer know how many
bytes were put into the buffer.) I believe you want to use
ByteBuffer.flip() instead of rewind().
If you use flip(), the limit is set to the current position before the
position is reset to zero. After a flip(), the remaining() method will
return the difference between the limit and the current position, which is
what you want: the number of bytes you just wrote into the buffer.
> + } else {
> + Destination content = new Destination();
> + layout.encode(event, content);
> + content.getByteBuffer().rewind();
> + byte[] record = new byte[content.getByteBuffer().remaining()];
> + content.getByteBuffer().get(record);
> + write(record);
> + }
> + }
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/58152b79/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
> index 05fa157..cd9ec82 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
> +++
> b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
> @@ -36,6 +36,9 @@ import
> org.apache.logging.log4j.core.layout.SerializedLayout;
> /**
> * This appender is primarily used for testing. Use in a real environment
> is discouraged as the
> * List could eventually grow to cause an OutOfMemoryError.
> + *
> + * This appender will use {@link Layout#toByteArray(LogEvent)}.
> + *
> * @see
> org.apache.logging.log4j.junit.LoggerContextRule#getListAppender(String)
> ILC.getListAppender
> */
> @Plugin(name = "List", category = "Core", elementType = "appender",
> printObject = true)
> @@ -45,11 +48,11 @@ public class ListAppender extends AbstractAppender {
>
> // Use CopyOnWriteArrayList?
>
> - private final List<LogEvent> events = new ArrayList<>();
> + final List<LogEvent> events = new ArrayList<>();
>
> private final List<String> messages = new ArrayList<>();
>
> - private final List<byte[]> data = new ArrayList<>();
> + final List<byte[]> data = new ArrayList<>();
>
> private final boolean newLine;
>
> @@ -93,7 +96,7 @@ public class ListAppender extends AbstractAppender {
> }
> }
>
> - private void write(final byte[] bytes) {
> + void write(final byte[] bytes) {
> if (raw) {
> data.add(bytes);
> return;
>
>