From dc0cf3e099a8f1f4a74cbf114afabaa5ba3eee4f Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Sat, 12 May 2018 20:25:11 +0200 Subject: [PATCH] Ensure Netty can be build with Java 11 (#7926) Motivation: Java 11 will be out soon, so we should be able to build (and run tests) netty. Modifications: - Add dependency that is needed till Java 11 - Adjust tests so these also pass on Java 11 (SocketChannelImpl.close() behavious a bit differently now). Result: Build also works (and tests pass) on Java 11. --- example/pom.xml | 6 +++++ pom.xml | 24 +++++++++++++++++++ .../socket/SocketHalfClosedTest.java | 15 ++++++++++-- .../transport/socket/SocketRstTest.java | 12 +++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/example/pom.xml b/example/pom.xml index 6612dbca84..ec072fdb8d 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -139,6 +139,12 @@ org.bouncycastle bcprov-jdk15on + + + + com.sun.activation + javax.activation + diff --git a/pom.xml b/pom.xml index 57299e9b9f..fcda89ca10 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,23 @@ + + + java11 + + 11 + + + + + true + + 3.0.0-M1 + + 2.0.5.Final + + + java10 @@ -268,6 +285,13 @@ ${project.version} + + + com.sun.activation + javax.activation + 1.2.0 + + org.javassist diff --git a/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketHalfClosedTest.java b/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketHalfClosedTest.java index 40b5e86ff7..cd03ac3c9b 100644 --- a/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketHalfClosedTest.java +++ b/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketHalfClosedTest.java @@ -37,6 +37,7 @@ import io.netty.util.UncheckedBooleanSupplier; import org.junit.Test; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -327,8 +328,18 @@ public class SocketHalfClosedTest extends AbstractSocketTest { public void operationComplete(ChannelFuture future) throws Exception { future.channel().close().addListener(new ChannelFutureListener() { @Override - public void operationComplete(ChannelFuture future) throws Exception { - followerCloseLatch.countDown(); + public void operationComplete(final ChannelFuture future) throws Exception { + // This is a bit racy but there is no better way how to handle this in Java11. + // The problem is that on close() the underlying FD will not actually be closed directly + // but the close will be done after the Selector did process all events. Because of + // this we will need to give it a bit time to ensure the FD is actual closed before we + // count down the latch and try to write. + future.channel().eventLoop().schedule(new Runnable() { + @Override + public void run() { + followerCloseLatch.countDown(); + } + }, 200, TimeUnit.MILLISECONDS); } }); } diff --git a/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketRstTest.java b/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketRstTest.java index 4eb1b84653..88cef1236a 100644 --- a/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketRstTest.java +++ b/testsuite/src/main/java/io/netty/testsuite/transport/socket/SocketRstTest.java @@ -22,6 +22,8 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.util.internal.PlatformDependent; import org.junit.Test; import java.io.IOException; @@ -89,8 +91,16 @@ public class SocketRstTest extends AbstractSocketTest { // Verify the client received a RST. Throwable cause = throwableRef.get(); + if (PlatformDependent.javaVersion() >= 11 && sb.config().group() instanceof NioEventLoopGroup) { + // In Java11 calling SocketChannel.close() will also call shutdown(..,SHUT_WR) before actual closing the + // fd which means we may not see the ECONNRESET at all :( + if (cause == null) { + return; + } + } assertTrue("actual [type, message]: [" + cause.getClass() + ", " + cause.getMessage() + "]", - cause instanceof IOException); + cause instanceof IOException); + assertRstOnCloseException((IOException) cause, cc); }