Thanks, fixed now. On Tue, Mar 8, 2016 at 10:13 PM, Remko Popma <[email protected]> wrote:
> > > On Wed, Mar 9, 2016 at 3:35 AM, <[email protected]> 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 <[email protected]> >> Authored: Tue Mar 8 17:34:43 2016 +0100 >> Committer: Mikael Ståldal <[email protected]> >> 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* [email protected] 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.
