This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/2.x by this push:
new 49ab16b32e Enhance logging in JTLNullEventDelimiterTest
49ab16b32e is described below
commit 49ab16b32eb550b763a9e1b6c4fac7dbab5ecde5
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Fri Oct 20 08:28:43 2023 +0200
Enhance logging in JTLNullEventDelimiterTest
The goal is to catch the reason of the recurrent failure on MacOS.
---
.../JsonTemplateLayoutNullEventDelimiterTest.java | 104 ++++++++++++++-------
.../JsonTemplateLayoutNullEventDelimiterTest.xml} | 2 +-
2 files changed, 72 insertions(+), 34 deletions(-)
diff --git
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java
index 133526decc..a163e54aa7 100644
---
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java
+++
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java
@@ -24,53 +24,87 @@ import java.net.ServerSocket;
import java.net.Socket;
import java.time.Duration;
+import org.apache.commons.codec.binary.Hex;
import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.assertj.core.api.Assertions;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.SocketAppender;
+import org.apache.logging.log4j.core.filter.AbstractFilter;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.core.test.junit.Named;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.test.TestProperties;
+import org.apache.logging.log4j.test.junit.UsingStatusListener;
+import org.apache.logging.log4j.test.junit.UsingTestProperties;
import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionTimeoutException;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@UsingStatusListener
+@UsingTestProperties
class JsonTemplateLayoutNullEventDelimiterTest {
- @Test
- void test() throws Exception {
+ private static Logger LOGGER = StatusLogger.getLogger();
+
+ private static TcpServer server;
+ private static TestProperties props;
+
+ @BeforeAll
+ static void setup() throws IOException {
// Start the TCP server.
- try (final TcpServer server = new TcpServer(0)) {
-
- // Set the configuration.
- System.setProperty(
- "serverPort",
- String.valueOf(server.getPort()));
- System.setProperty(
- "log4j.configurationFile",
- "nullEventDelimitedJsonTemplateLayoutLogging.xml");
-
- // Produce log events.
- final Logger logger =
LogManager.getLogger(JsonTemplateLayoutNullEventDelimiterTest.class);
- logger.log(Level.INFO, "foo");
- logger.log(Level.INFO, "bar");
-
- // Set the expected bytes.
- final byte[] expectedBytes = {
- '"', 'f', 'o', 'o', '"', '\0',
- '"', 'b', 'a', 'r', '"', '\0'
- };
-
- // Wait for the log events.
+ server = new TcpServer(0);
+ // Set the configuration.
+ props.setProperty("serverPort", server.getPort());
+ }
+
+ @AfterAll
+ static void cleanup() throws IOException {
+ // Stop the TCP server.
+ server.close();
+ }
+
+ @Test
+ @LoggerContextSource
+ void test(final @Named("Socket") SocketAppender appender, final
LoggerContext ctx) throws Exception {
+ assertThat(appender).isNotNull();
+ appender.addFilter(new AbstractFilter() {
+ @Override
+ public Result filter(LogEvent event) {
+ LOGGER.info("Sending message {}", event.getMessage());
+ return super.filter(event);
+ }
+ });
+ // Produce log events.
+ final Logger logger =
ctx.getLogger(JsonTemplateLayoutNullEventDelimiterTest.class);
+ logger.log(Level.INFO, "foo");
+ logger.log(Level.INFO, "bar");
+
+ // Set the expected bytes.
+ final byte[] expectedBytes = {
+ '"', 'f', 'o', 'o', '"', '\0',
+ '"', 'b', 'a', 'r', '"', '\0'
+ };
+
+ // Wait for the log events.
+ try {
Awaitility
.await()
.atMost(Duration.ofSeconds(10))
.pollDelay(Duration.ofSeconds(1))
.until(() -> server.getTotalReadByteCount() >=
expectedBytes.length);
-
- // Verify the received log events.
- final byte[] actualBytes = server.getReceivedBytes();
- Assertions.assertThat(actualBytes).startsWith(expectedBytes);
-
+ } catch (final ConditionTimeoutException e) {
+ LOGGER.info("Timeout reached while waiting for {} bytes.",
expectedBytes.length);
}
+ // Verify the received log events.
+ final byte[] actualBytes = server.getReceivedBytes();
+ assertThat(actualBytes).containsExactly(expectedBytes);
}
private static final class TcpServer extends Thread implements
AutoCloseable {
@@ -90,6 +124,7 @@ class JsonTemplateLayoutNullEventDelimiterTest {
serverSocket.setSoTimeout(5_000);
setDaemon(true);
start();
+ LOGGER.info("TcpServer started on port {}.", port);
}
@Override
@@ -98,14 +133,16 @@ class JsonTemplateLayoutNullEventDelimiterTest {
try (final Socket socket = serverSocket.accept()) {
final InputStream inputStream = socket.getInputStream();
final byte[] buffer = new byte[1024];
- // noinspection InfiniteLoopStatement
while (true) {
final int readByteCount = inputStream.read(buffer);
- if (readByteCount > 0) {
+ if (readByteCount != -1) {
+ LOGGER.info("Received bytes {}.", () ->
Hex.encodeHex(buffer, 0, readByteCount, false));
synchronized (this) {
totalReadByteCount += readByteCount;
outputStream.write(buffer, 0, readByteCount);
}
+ } else {
+ break;
}
}
}
@@ -113,6 +150,7 @@ class JsonTemplateLayoutNullEventDelimiterTest {
// Socket is closed.
} catch (final Exception error) {
if (!closed) {
+ LOGGER.error("TcpServer received an error.", error);
throw new RuntimeException(error);
}
}
diff --git
a/log4j-layout-template-json-test/src/test/resources/nullEventDelimitedJsonTemplateLayoutLogging.xml
b/log4j-layout-template-json-test/src/test/resources/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.xml
similarity index 97%
rename from
log4j-layout-template-json-test/src/test/resources/nullEventDelimitedJsonTemplateLayoutLogging.xml
rename to
log4j-layout-template-json-test/src/test/resources/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.xml
index 058309b3e1..6b1ec05bfa 100644
---
a/log4j-layout-template-json-test/src/test/resources/nullEventDelimitedJsonTemplateLayoutLogging.xml
+++
b/log4j-layout-template-json-test/src/test/resources/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.xml
@@ -19,7 +19,7 @@
<Appenders>
<Socket name="Socket"
host="localhost"
- port="${sys:serverPort}"
+ port="${test:serverPort}"
protocol="TCP"
ignoreExceptions="false"
reconnectionDelay="100"