Skip to content

Commit 993f0a2

Browse files
committed
Enhance logging in JTLNullEventDelimiterTest
The goal is to catch the reason of the recurrent failure on MacOS.
1 parent 77129a6 commit 993f0a2

File tree

2 files changed

+72
-34
lines changed

2 files changed

+72
-34
lines changed

log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.java

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,53 +24,87 @@
2424
import java.net.Socket;
2525
import java.time.Duration;
2626

27+
import org.apache.commons.codec.binary.Hex;
2728
import org.apache.logging.log4j.Level;
28-
import org.apache.logging.log4j.LogManager;
2929
import org.apache.logging.log4j.Logger;
30-
import org.assertj.core.api.Assertions;
30+
import org.apache.logging.log4j.core.LogEvent;
31+
import org.apache.logging.log4j.core.LoggerContext;
32+
import org.apache.logging.log4j.core.appender.SocketAppender;
33+
import org.apache.logging.log4j.core.filter.AbstractFilter;
34+
import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
35+
import org.apache.logging.log4j.core.test.junit.Named;
36+
import org.apache.logging.log4j.status.StatusLogger;
37+
import org.apache.logging.log4j.test.TestProperties;
38+
import org.apache.logging.log4j.test.junit.UsingStatusListener;
39+
import org.apache.logging.log4j.test.junit.UsingTestProperties;
3140
import org.awaitility.Awaitility;
41+
import org.awaitility.core.ConditionTimeoutException;
42+
import org.junit.jupiter.api.AfterAll;
43+
import org.junit.jupiter.api.BeforeAll;
3244
import org.junit.jupiter.api.Test;
3345

46+
import static org.assertj.core.api.Assertions.assertThat;
47+
48+
@UsingStatusListener
49+
@UsingTestProperties
3450
class JsonTemplateLayoutNullEventDelimiterTest {
3551

36-
@Test
37-
void test() throws Exception {
52+
private static Logger LOGGER = StatusLogger.getLogger();
53+
54+
private static TcpServer server;
3855

56+
private static TestProperties props;
57+
58+
@BeforeAll
59+
static void setup() throws IOException {
3960
// Start the TCP server.
40-
try (final TcpServer server = new TcpServer(0)) {
41-
42-
// Set the configuration.
43-
System.setProperty(
44-
"serverPort",
45-
String.valueOf(server.getPort()));
46-
System.setProperty(
47-
"log4j.configurationFile",
48-
"nullEventDelimitedJsonTemplateLayoutLogging.xml");
49-
50-
// Produce log events.
51-
final Logger logger = LogManager.getLogger(JsonTemplateLayoutNullEventDelimiterTest.class);
52-
logger.log(Level.INFO, "foo");
53-
logger.log(Level.INFO, "bar");
54-
55-
// Set the expected bytes.
56-
final byte[] expectedBytes = {
57-
'"', 'f', 'o', 'o', '"', '\0',
58-
'"', 'b', 'a', 'r', '"', '\0'
59-
};
60-
61-
// Wait for the log events.
61+
server = new TcpServer(0);
62+
// Set the configuration.
63+
props.setProperty("serverPort", server.getPort());
64+
}
65+
66+
@AfterAll
67+
static void cleanup() throws IOException {
68+
// Stop the TCP server.
69+
server.close();
70+
}
71+
72+
@Test
73+
@LoggerContextSource
74+
void test(final @Named("Socket") SocketAppender appender, final LoggerContext ctx) throws Exception {
75+
assertThat(appender).isNotNull();
76+
appender.addFilter(new AbstractFilter() {
77+
@Override
78+
public Result filter(LogEvent event) {
79+
LOGGER.info("Sending message {}", event.getMessage());
80+
return super.filter(event);
81+
}
82+
});
83+
// Produce log events.
84+
final Logger logger = ctx.getLogger(JsonTemplateLayoutNullEventDelimiterTest.class);
85+
logger.log(Level.INFO, "foo");
86+
logger.log(Level.INFO, "bar");
87+
88+
// Set the expected bytes.
89+
final byte[] expectedBytes = {
90+
'"', 'f', 'o', 'o', '"', '\0',
91+
'"', 'b', 'a', 'r', '"', '\0'
92+
};
93+
94+
// Wait for the log events.
95+
try {
6296
Awaitility
6397
.await()
6498
.atMost(Duration.ofSeconds(10))
6599
.pollDelay(Duration.ofSeconds(1))
66100
.until(() -> server.getTotalReadByteCount() >= expectedBytes.length);
67-
68-
// Verify the received log events.
69-
final byte[] actualBytes = server.getReceivedBytes();
70-
Assertions.assertThat(actualBytes).startsWith(expectedBytes);
71-
101+
} catch (final ConditionTimeoutException e) {
102+
LOGGER.info("Timeout reached while waiting for {} bytes.", expectedBytes.length);
72103
}
73104

105+
// Verify the received log events.
106+
final byte[] actualBytes = server.getReceivedBytes();
107+
assertThat(actualBytes).containsExactly(expectedBytes);
74108
}
75109

76110
private static final class TcpServer extends Thread implements AutoCloseable {
@@ -90,6 +124,7 @@ private TcpServer(final int port) throws IOException {
90124
serverSocket.setSoTimeout(5_000);
91125
setDaemon(true);
92126
start();
127+
LOGGER.info("TcpServer started on port {}.", port);
93128
}
94129

95130
@Override
@@ -98,21 +133,24 @@ public void run() {
98133
try (final Socket socket = serverSocket.accept()) {
99134
final InputStream inputStream = socket.getInputStream();
100135
final byte[] buffer = new byte[1024];
101-
// noinspection InfiniteLoopStatement
102136
while (true) {
103137
final int readByteCount = inputStream.read(buffer);
104-
if (readByteCount > 0) {
138+
if (readByteCount != -1) {
139+
LOGGER.info("Received bytes {}.", () -> Hex.encodeHex(buffer, 0, readByteCount, false));
105140
synchronized (this) {
106141
totalReadByteCount += readByteCount;
107142
outputStream.write(buffer, 0, readByteCount);
108143
}
144+
} else {
145+
break;
109146
}
110147
}
111148
}
112149
} catch (final EOFException ignored) {
113150
// Socket is closed.
114151
} catch (final Exception error) {
115152
if (!closed) {
153+
LOGGER.error("TcpServer received an error.", error);
116154
throw new RuntimeException(error);
117155
}
118156
}

log4j-layout-template-json-test/src/test/resources/nullEventDelimitedJsonTemplateLayoutLogging.xml renamed to log4j-layout-template-json-test/src/test/resources/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutNullEventDelimiterTest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<Appenders>
2020
<Socket name="Socket"
2121
host="localhost"
22-
port="${sys:serverPort}"
22+
port="${test:serverPort}"
2323
protocol="TCP"
2424
ignoreExceptions="false"
2525
reconnectionDelay="100"

0 commit comments

Comments
 (0)