This is an automated email from the ASF dual-hosted git repository.
vy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/main by this push:
new 0828381f1f Improve `SocketAppenderReconnectTest` (#3004)
0828381f1f is described below
commit 0828381f1f147b7d98ab8d8732f38343dc215330
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Tue Oct 1 22:25:59 2024 +0200
Improve `SocketAppenderReconnectTest` (#3004)
---
.../log4j/core/appender/LineReadingTcpServer.java | 4 +-
.../core/appender/SocketAppenderReconnectTest.java | 45 +++++++++++++++-------
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/LineReadingTcpServer.java
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/LineReadingTcpServer.java
index aa5119164a..9f4028423a 100644
---
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/LineReadingTcpServer.java
+++
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/LineReadingTcpServer.java
@@ -23,6 +23,7 @@ import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
@@ -82,7 +83,8 @@ final class LineReadingTcpServer implements AutoCloseable {
}
private ServerSocket createServerSocket(final int port) throws IOException
{
- final ServerSocket serverSocket =
serverSocketFactory.createServerSocket(port);
+ final ServerSocket serverSocket =
+ serverSocketFactory.createServerSocket(port, 1,
InetAddress.getLoopbackAddress());
serverSocket.setReuseAddress(true);
serverSocket.setSoTimeout(0); // Zero indicates `accept()` will block
indefinitely
await("server socket binding")
diff --git
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderReconnectTest.java
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderReconnectTest.java
index ba590cfe25..618caad4c0 100644
---
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderReconnectTest.java
+++
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderReconnectTest.java
@@ -47,6 +47,7 @@ import org.apache.logging.log4j.core.net.TcpSocketManager;
import org.apache.logging.log4j.core.net.TcpSocketManager.HostResolver;
import org.apache.logging.log4j.core.net.ssl.SslKeyStoreConstants;
import org.apache.logging.log4j.plugins.di.DI;
+import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.test.junit.UsingStatusListener;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.CleanupMode;
@@ -57,6 +58,8 @@ import org.junit.jupiter.api.io.TempDir;
*/
public class SocketAppenderReconnectTest {
+ private static final String CLASS_NAME =
SocketAppenderReconnectTest.class.getSimpleName();
+
private static final int EPHEMERAL_PORT = 0;
private static final String APPENDER_NAME = "TestSocket";
@@ -73,10 +76,11 @@ public class SocketAppenderReconnectTest {
// Start the server.
server.start("Main", EPHEMERAL_PORT);
- final int port = server.getServerSocket().getLocalPort();
+ final String serverHost =
server.getServerSocket().getInetAddress().getHostAddress();
+ final int serverPort = server.getServerSocket().getLocalPort();
// Initialize the logger context
- final Configuration config = createConfiguration(port, null);
+ final Configuration config = createConfiguration(serverHost,
serverPort, null);
try (final LoggerContext loggerContext =
createStartedLoggerContext(config)) {
// Configure the error handler
@@ -91,7 +95,7 @@ public class SocketAppenderReconnectTest {
verifyLoggingFailure(loggerContext, errorHandler);
// Start the server again, and verify the logging success.
- server.start("Main", port);
+ server.start("Main", serverPort);
verifyLoggingSuccess(loggerContext, server, errorHandler);
}
}
@@ -117,9 +121,9 @@ public class SocketAppenderReconnectTest {
// Initialize the logger context
final Configuration config = createConfiguration(
- // Passing an invalid port, since the resolution is
supposed to be performed by the mocked host
- // resolver anyway.
- 0, null);
+ // Passing dummy host & port, since the resolution is
supposed to be performed by the mocked
+ // host resolver anyway.
+ "localhost", 0, null);
try (final LoggerContext loggerContext =
createStartedLoggerContext(config)) {
// Configure the error handler
@@ -211,7 +215,9 @@ public class SocketAppenderReconnectTest {
// Start the 1st server
server1.start("1st", EPHEMERAL_PORT);
- final int port = server1.getServerSocket().getLocalPort();
+ final String server1Host =
+
server1.getServerSocket().getInetAddress().getHostAddress();
+ final int server1Port = server1.getServerSocket().getLocalPort();
// Create the configuration transformer to add the `<Ssl>`,
`<KeyStore>`, and `<TrustStore>` elements
final BiFunction<
@@ -237,7 +243,8 @@ public class SocketAppenderReconnectTest {
};
// Initialize the logger context
- final Configuration config1 = createConfiguration(port,
appenderComponentBuilderTransformer);
+ final Configuration config1 =
+ createConfiguration(server1Host, server1Port,
appenderComponentBuilderTransformer);
try (final LoggerContext loggerContext =
createStartedLoggerContext(config1)) {
// Configure the error handler
@@ -249,7 +256,7 @@ public class SocketAppenderReconnectTest {
// Stop the 1st server and start the 2nd one (using different
SSL configuration!) on the same port
server1.close();
- server2.start("2nd", port);
+ server2.start("2nd", server1Port);
// Stage the key store files using the 2nd `SSLContext`
Files.write(keyStoreFilePath,
Files.readAllBytes(Paths.get(keyStore2Location)));
@@ -281,7 +288,8 @@ public class SocketAppenderReconnectTest {
//
// Hence, the only way is to programmatically build the very
same configuration, twice, and use the 1st
// one for initialization, and the 2nd one for reconfiguration.
- final Configuration config2 = createConfiguration(port,
appenderComponentBuilderTransformer);
+ final Configuration config2 =
+ createConfiguration(server1Host, server1Port,
appenderComponentBuilderTransformer);
loggerContext.reconfigure(config2);
// Verify the working state on the 2nd server
@@ -291,6 +299,7 @@ public class SocketAppenderReconnectTest {
}
private static Configuration createConfiguration(
+ final String host,
final int port,
@Nullable
final BiFunction<
@@ -308,7 +317,7 @@ public class SocketAppenderReconnectTest {
// Create the appender configuration
final AppenderComponentBuilder appenderComponentBuilder = configBuilder
.newAppender(APPENDER_NAME, "Socket")
- .addAttribute("host", "localhost")
+ .addAttribute("host", host)
.addAttribute("port", port)
.addAttribute("ignoreExceptions", false)
.addAttribute("reconnectionDelayMillis", 10)
@@ -341,6 +350,9 @@ public class SocketAppenderReconnectTest {
final BufferingErrorHandler errorHandler)
throws Exception {
+ // Report status
+ StatusLogger.getLogger().debug("[{}] verifying logging success",
CLASS_NAME);
+
// Create messages to log
final int messageCount = 2;
assertThat(messageCount)
@@ -356,10 +368,10 @@ public class SocketAppenderReconnectTest {
await("first socket append")
.pollInterval(100, TimeUnit.MILLISECONDS)
.atMost(120, TimeUnit.SECONDS)
- .until(() -> {
+ .ignoreExceptions()
+ .untilAsserted(() -> {
final String message = expectedMessages.get(0);
logger.info(message);
- return true;
});
// Reset the error handler
@@ -381,11 +393,18 @@ public class SocketAppenderReconnectTest {
private static void verifyLoggingFailure(
final LoggerContext loggerContext, final BufferingErrorHandler
errorHandler) {
+
+ // Report status
+ StatusLogger.getLogger().debug("[{}] verifying logging failure",
CLASS_NAME);
+
+ // Verify the configuration
final Logger logger = loggerContext.getRootLogger();
final int retryCount = 3;
assertThat(retryCount)
.as("expecting `retryCount > 1` due to LOG4J2-2829")
.isGreaterThan(1);
+
+ // Verify the failure
for (int i = 0; i < retryCount; i++) {
try {
logger.info("should fail #" + i);