| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache license, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the license for the specific language governing permissions and |
| * limitations under the license. |
| */ |
| package org.apache.logging.log4j.core.appender.net; |
| |
| import java.io.IOException; |
| import java.net.Socket; |
| |
| import org.apache.logging.log4j.core.appender.SocketAppender; |
| import org.apache.logging.log4j.core.layout.JsonLayout; |
| import org.apache.logging.log4j.core.net.SocketOptions; |
| import org.apache.logging.log4j.core.net.ssl.SslConfiguration; |
| import org.apache.logging.log4j.core.net.ssl.SslConfigurationTest; |
| import org.apache.logging.log4j.core.net.ssl.StoreConfigurationException; |
| import org.apache.logging.log4j.server.SecureTcpSocketServer; |
| import org.apache.logging.log4j.server.TcpSocketServer; |
| import org.apache.logging.log4j.test.AvailablePortFinder; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| /** |
| * Tests that a Secure Socket Appender can reconnect to a server after it has been recycled. |
| * <p> |
| * LOG4J2-2013 SslSocketManager does not apply SSLContext on TCP reconnect. |
| * </p> |
| * <p> |
| * LOG4J2-1311 SocketAppender will lost first several logs after re-connection to log servers. |
| * </p> |
| * <p> |
| * See also LOG4J2-1934 JMS Appender does not know how to recover from a broken connection. See |
| * https://issues.apache.org/jira/browse/LOG4J2-1934 |
| * </p> |
| * <p> |
| * This test class' single test method performs the following: |
| * </p> |
| * <ol> |
| * <li>Starts Apache Socket Server</li> |
| * <li>Starts a Socket Appender</li> |
| * <li>Logs an event OK</li> |
| * <li>Stops Apache Socket Server</li> |
| * <li>Starts Apache Socket Server</li> |
| * <li>Logs an event</li> |
| * </ol> |
| */ |
| public class SecureSocketAppenderConnectReConnectIT extends AbstractSocketAppenderReconnectIT { |
| |
| private SslConfiguration sslConfiguration; |
| |
| @Before |
| public void initServerSocketFactory() throws StoreConfigurationException { |
| sslConfiguration = SslConfigurationTest.createTestSslConfigurationResources(); |
| } |
| |
| @Test |
| //@Ignore |
| public void testConnectReConnect() throws Exception { |
| port = AvailablePortFinder.getNextAvailable(); |
| // Start server |
| server = SecureTcpSocketServer.createJsonServer(port, sslConfiguration); |
| startServer(200); |
| // Start appender |
| // @formatter:off |
| appender = SocketAppender.newBuilder() |
| .withPort(port) |
| .withConnectTimeoutMillis(1000) |
| .withSocketOptions(SocketOptions.newBuilder().setSoTimeout(1000)) |
| .withReconnectDelayMillis(1000) |
| .withName("test") |
| .withLayout(JsonLayout.newBuilder().build()) |
| .withSslConfiguration(sslConfiguration) |
| .build(); |
| // @formatter:on |
| appender.start(); |
| // Log message |
| appendEvent(appender); |
| // Stop server |
| shutdown(); |
| // I should not be able to connect to the server now |
| try { |
| try (Socket socket = new Socket("localhost", port)) { |
| Assert.fail("The server socket should not be opened: " + socket); |
| } |
| } catch (final IOException e) { |
| // expected |
| } |
| // HACK START - Gary |
| // SANS HACK, the test passes, as somehow the socket in the appender is still valid |
| // On Windows 10, I did not try other OSs: |
| // HERE, I BREAKPOINT AND GO TO THE OS AND FORCE THE TCP CONNECTION TO CLOSE (TcpView.exe)), SUCH THAT |
| // INTERNALLY THE MANAGER GETS: |
| // java.net.SocketException: Connection reset by peer: socket write error |
| // HACK END |
| // |
| // Restart server on the SAME port |
| server = SecureTcpSocketServer.createJsonServer(port, sslConfiguration); |
| thread = startServer(0); |
| try (Socket socket = new Socket("localhost", port)) { |
| Assert.assertTrue(socket.isBound()); |
| Assert.assertFalse(socket.isClosed()); |
| } |
| // Logging again should cause the appender to reconnect |
| appendEvent(appender); |
| } |
| |
| } |