From e2921ac6931f2ed3c4b06aae12db3ebf785f059e Mon Sep 17 00:00:00 2001 From: Imane Erguiti Date: Fri, 26 Sep 2025 16:43:34 +0100 Subject: [PATCH] fix: use random ports in NettyTests to avoid port binding conflicts - Modified startServer() to bind to port 0 and return actual port - Updated startClient() to accept port parameter - Resolves Address already in use errors with Netty 4.2.3.Final --- .../netty-transport/4.2.3.Final/index.json | 3 + .../4.2.3.Final/reflect-config.json | 696 ++++++++++++++++++ metadata/io.netty/netty-transport/index.json | 9 +- tests/src/index.json | 10 +- .../netty-transport/4.2.3.Final/.gitignore | 4 + .../netty-transport/4.2.3.Final/build.gradle | 39 + .../4.2.3.Final/gradle.properties | 2 + .../4.2.3.Final/settings.gradle | 13 + .../netty_transport/Netty_transportTest.java | 299 ++++++++ .../netty-tests/resource-config.json | 13 + .../4.2.3.Final/src/test/resources/cert.pem | 22 + .../4.2.3.Final/src/test/resources/key.pem | 28 + .../4.2.3.Final/user-code-filter.json | 10 + 13 files changed, 1145 insertions(+), 3 deletions(-) create mode 100644 metadata/io.netty/netty-transport/4.2.3.Final/index.json create mode 100644 metadata/io.netty/netty-transport/4.2.3.Final/reflect-config.json create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/.gitignore create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/build.gradle create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/gradle.properties create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/settings.gradle create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/src/test/java/io_netty/netty_transport/Netty_transportTest.java create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/META-INF/native-image/netty-tests/resource-config.json create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/cert.pem create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/key.pem create mode 100644 tests/src/io.netty/netty-transport/4.2.3.Final/user-code-filter.json diff --git a/metadata/io.netty/netty-transport/4.2.3.Final/index.json b/metadata/io.netty/netty-transport/4.2.3.Final/index.json new file mode 100644 index 000000000..768b5502a --- /dev/null +++ b/metadata/io.netty/netty-transport/4.2.3.Final/index.json @@ -0,0 +1,3 @@ +[ + "reflect-config.json" +] diff --git a/metadata/io.netty/netty-transport/4.2.3.Final/reflect-config.json b/metadata/io.netty/netty-transport/4.2.3.Final/reflect-config.json new file mode 100644 index 000000000..a3ec465ae --- /dev/null +++ b/metadata/io.netty/netty-transport/4.2.3.Final/reflect-config.json @@ -0,0 +1,696 @@ +[ +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"[B" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"[Ljava.lang.String;" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"[Lsun.security.pkcs.SignerInfo;" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"apple.security.AppleProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.codec.compression.Brotli"}, + "name":"com.aayushatharva.brotli4j.Brotli4jLoader" +}, +{ + "condition":{"typeReachable":"io.netty.handler.codec.compression.Zstd"}, + "name":"com.github.luben.zstd.Zstd" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.AESCipher$General", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler$SslEngineType$3"}, + "name":"com.sun.crypto.provider.AESKeyGenerator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.ARCFOURCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.DESCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.DESedeCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.DHParameters", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler$SslEngineType$3"}, + "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler$SslEngineType$3"}, + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndDES", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndDES", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"com.sun.crypto.provider.PBES2Core$HmacSHA256AndAES_256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"com.sun.crypto.provider.PBES2Core$HmacSHA256AndAES_256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"com.sun.crypto.provider.PBES2Parameters$General", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"com.sun.crypto.provider.PBES2Parameters$General", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"com.sun.crypto.provider.PBES2Parameters$HmacSHA256AndAES_256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"com.sun.crypto.provider.TlsMasterSecretGenerator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.buffer.AbstractByteBufAllocator"}, + "name":"io.netty.buffer.AbstractByteBufAllocator", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"io.netty.buffer.AbstractReferenceCountedByteBuf"}, + "name":"io.netty.buffer.AbstractReferenceCountedByteBuf", + "fields":[{"name":"refCnt"}] +}, +{ + "condition":{"typeReachable":"io.netty.buffer.AdaptivePoolingAllocator$Chunk"}, + "name":"io.netty.buffer.AdaptivePoolingAllocator$Chunk", + "fields":[{"name":"refCnt"}] +}, +{ + "condition":{"typeReachable":"io.netty.buffer.AdaptivePoolingAllocator$Magazine"}, + "name":"io.netty.buffer.AdaptivePoolingAllocator$Magazine", + "fields":[{"name":"nextInLine"}] +}, +{ + "condition":{"typeReachable":"io.netty.channel.AbstractChannelHandlerContext"}, + "name":"io.netty.channel.AbstractChannelHandlerContext", + "fields":[{"name":"handlerState"}] +}, +{ + "condition":{"typeReachable":"io.netty.channel.ChannelOutboundBuffer"}, + "name":"io.netty.channel.ChannelOutboundBuffer", + "fields":[{"name":"totalPendingSize"}, {"name":"unwritable"}] +}, +{ + "condition":{"typeReachable":"io.netty.channel.DefaultChannelConfig"}, + "name":"io.netty.channel.DefaultChannelConfig", + "fields":[{"name":"autoRead"}, {"name":"writeBufferWaterMark"}] +}, +{ + "condition":{"typeReachable":"io.netty.channel.DefaultChannelPipeline"}, + "name":"io.netty.channel.DefaultChannelPipeline", + "fields":[{"name":"estimatorHandle"}] +}, +{ + "condition":{"typeReachable":"io.netty.bootstrap.AbstractBootstrap"}, + "name":"io.netty.channel.socket.nio.NioServerSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.ReflectiveChannelFactory"}, + "name":"io.netty.channel.socket.nio.NioServerSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.bootstrap.Bootstrap"}, + "name":"io.netty.channel.socket.nio.NioSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.ReflectiveChannelFactory"}, + "name":"io.netty.channel.socket.nio.NioSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.OpenSsl"}, + "name":"io.netty.internal.tcnative.SSLContext" +}, +{ + "condition":{"typeReachable":"io.netty.util.DefaultAttributeMap"}, + "name":"io.netty.util.DefaultAttributeMap", + "fields":[{"name":"attributes"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.Recycler$DefaultHandle"}, + "name":"io.netty.util.Recycler$DefaultHandle", + "fields":[{"name":"state"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.ReferenceCountUtil"}, + "name":"io.netty.util.ReferenceCountUtil", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"io.netty.util.ResourceLeakDetector$DefaultResourceLeak"}, + "name":"io.netty.util.ResourceLeakDetector$DefaultResourceLeak", + "fields":[{"name":"droppedRecords"}, {"name":"head"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.concurrent.DefaultPromise"}, + "name":"io.netty.util.concurrent.DefaultPromise", + "fields":[{"name":"result"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.concurrent.MpscIntQueue$MpscAtomicIntegerArrayQueue"}, + "name":"io.netty.util.concurrent.MpscIntQueue$MpscAtomicIntegerArrayQueue", + "fields":[{"name":"consumerIndex"}, {"name":"producerIndex"}, {"name":"producerLimit"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.concurrent.SingleThreadEventExecutor"}, + "name":"io.netty.util.concurrent.SingleThreadEventExecutor", + "fields":[{"name":"state"}, {"name":"threadProperties"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields"}, + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields":[{"name":"producerLimit"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields"}, + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields":[{"name":"consumerIndex"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields"}, + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields":[{"name":"producerIndex"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.queues.MpmcArrayQueueConsumerIndexField"}, + "name":"io.netty.util.internal.shaded.org.jctools.queues.MpmcArrayQueueConsumerIndexField", + "fields":[{"name":"consumerIndex"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.queues.MpmcArrayQueueProducerIndexField"}, + "name":"io.netty.util.internal.shaded.org.jctools.queues.MpmcArrayQueueProducerIndexField", + "fields":[{"name":"producerIndex"}] +}, +{ + "condition":{"typeReachable":"io.netty.channel.DefaultChannelId"}, + "name":"java.lang.ProcessHandle", + "methods":[{"name":"current","parameterTypes":[] }, {"name":"pid","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"java.lang.String" +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent"}, + "name":"java.lang.management.ManagementFactory", + "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent"}, + "name":"java.lang.management.RuntimeMXBean", + "methods":[{"name":"getInputArguments","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$5"}, + "name":"java.nio.Bits", + "methods":[{"name":"unaligned","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$3"}, + "name":"java.nio.Buffer", + "fields":[{"name":"address"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$8"}, + "name":"java.nio.ByteBuffer", + "methods":[{"name":"alignedSlice","parameterTypes":["int"] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$4"}, + "name":"java.nio.DirectByteBuffer", + "methods":[{"name":"","parameterTypes":["long","int"] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.socket.nio.NioServerSocketChannel"}, + "name":"java.nio.channels.spi.SelectorProvider", + "methods":[{"name":"openServerSocketChannel","parameterTypes":["java.net.ProtocolFamily"] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.socket.nio.NioSocketChannel"}, + "name":"java.nio.channels.spi.SelectorProvider", + "methods":[{"name":"openSocketChannel","parameterTypes":["java.net.ProtocolFamily"] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.socket.nio.SelectorProviderUtil"}, + "name":"java.nio.channels.spi.SelectorProvider" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"java.security.AlgorithmParametersSpi" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"java.security.KeyStoreSpi" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslClientContext"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslUtils"}, + "name":"java.security.SecureRandomParameters" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"java.security.interfaces.RSAPrivateKey" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"java.security.interfaces.RSAPublicKey" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"java.util.Date" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"javax.security.auth.x500.X500Principal", + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"javax.security.auth.x500.X500Principal", + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContextBuilder"}, + "name":"javax.security.auth.x500.X500Principal", + "fields":[{"name":"thisX500Name"}], + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$6"}, + "name":"jdk.internal.misc.Unsafe", + "methods":[{"name":"getUnsafe","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.BouncyCastlePemReader$1"}, + "name":"org.bouncycastle.openssl.PEMParser" +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.CleanerJava9$1"}, + "name":"sun.misc.Unsafe", + "methods":[{"name":"invokeCleaner","parameterTypes":["java.nio.ByteBuffer"] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$1"}, + "name":"sun.misc.Unsafe", + "fields":[{"name":"theUnsafe"}] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.PlatformDependent0$2"}, + "name":"sun.misc.Unsafe", + "methods":[{"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] }] +}, +{ + "condition":{"typeReachable":"io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"}, + "name":"sun.misc.Unsafe", + "fields":[{"name":"theUnsafe"}], + "methods":[{"name":"getAndAddLong","parameterTypes":["java.lang.Object","long","long"] }, {"name":"getAndSetObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.channel.nio.NioIoHandler$2"}, + "name":"sun.nio.ch.SelectorImpl" +}, +{ + "condition":{"typeReachable":"io.netty.channel.nio.NioIoHandler$3"}, + "name":"sun.nio.ch.SelectorImpl", + "fields":[{"name":"publicSelectedKeys"}, {"name":"selectedKeys"}] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.pkcs12.PKCS12KeyStore", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.pkcs12.PKCS12KeyStore", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.DSA$SHA224withDSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.DSA$SHA256withDSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.JavaKeyStore$JKS", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslClientContext"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslUtils"}, + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.SHA2$SHA224", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler$SslEngineType$3"}, + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.SHA5$SHA384", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.SHA5$SHA512", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.rsa.PSSParameters", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.rsa.RSAPSSSignature", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslHandler"}, + "name":"sun.security.rsa.RSAPSSSignature", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.rsa.RSASignature$SHA224withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContext"}, + "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslClientContext"}, + "name":"sun.security.ssl.SSLContextImpl$TLSContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.ssl.SSLContextImpl$TLSContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.ssl.SSLContextImpl$TLSContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslUtils"}, + "name":"sun.security.ssl.SSLContextImpl$TLSContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.util.ObjectIdentifier" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.AuthorityInfoAccessExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContextBuilder"}, + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContextBuilder"}, + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.CRLDistributionPointsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslServerContext"}, + "name":"sun.security.x509.CertificateExtensions" +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.CertificatePoliciesExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.ExtendedKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.IssuerAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.KeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.NetscapeCertTypeExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.PrivateKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.SubjectAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.JdkSslContext$Defaults"}, + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "condition":{"typeReachable":"io.netty.handler.ssl.SslContextBuilder"}, + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +} +] \ No newline at end of file diff --git a/metadata/io.netty/netty-transport/index.json b/metadata/io.netty/netty-transport/index.json index 9469ca94f..dc1bff368 100644 --- a/metadata/io.netty/netty-transport/index.json +++ b/metadata/io.netty/netty-transport/index.json @@ -1,6 +1,13 @@ [ { - "latest" : true, + "latest": true, + "metadata-version": "4.2.3.Final", + "module": "io.netty:netty-transport", + "tested-versions": [ + "4.2.3.Final" + ] + }, + { "override" : true, "module" : "io.netty:netty-transport", "metadata-version" : "4.1.115.Final", diff --git a/tests/src/index.json b/tests/src/index.json index 7549d300b..7c7691742 100644 --- a/tests/src/index.json +++ b/tests/src/index.json @@ -208,6 +208,12 @@ "name" : "io.netty:netty-transport", "versions" : [ "4.1.80.Final" ] } ] +}, { + "test-project-path" : "io.netty/netty-transport/4.2.3.Final", + "libraries" : [ { + "name" : "io.netty:netty-transport", + "versions" : [ "4.2.3.Final" ] + } ] }, { "test-project-path" : "io.opentelemetry/opentelemetry-exporter-jaeger/1.19.0", "libraries" : [ { @@ -526,13 +532,13 @@ "name" : "org.hibernate.orm:hibernate-core", "versions" : [ "6.6.0.Final" ] } ] - }, { +}, { "test-project-path" : "org.hibernate.orm/hibernate-core/7.0.0.Final", "libraries" : [ { "name" : "org.hibernate.orm:hibernate-core", "versions" : [ "7.0.0.Final" ] } ] - }, { +}, { "test-project-path" : "org.hibernate.orm/hibernate-core/7.1.0.Final", "libraries" : [ { "name" : "org.hibernate.orm:hibernate-core", diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/.gitignore b/tests/src/io.netty/netty-transport/4.2.3.Final/.gitignore new file mode 100644 index 000000000..c98c7875b --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/.gitignore @@ -0,0 +1,4 @@ +gradlew.bat +gradlew +gradle/ +build/ diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/build.gradle b/tests/src/io.netty/netty-transport/4.2.3.Final/build.gradle new file mode 100644 index 000000000..60d82c7bd --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/build.gradle @@ -0,0 +1,39 @@ +/* + * Copyright and related rights waived via CC0 + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see . + */ + +plugins { + id "org.graalvm.internal.tck" +} + +String libraryVersion = tck.testedLibraryVersion.get() + +dependencies { + testImplementation "io.netty:netty-codec-http:$libraryVersion" + testImplementation 'org.assertj:assertj-core:3.22.0' + testImplementation 'org.awaitility:awaitility:4.2.0' +} + +graalvmNative { + agent { + defaultMode = "conditional" + modes { + conditional { + userCodeFilterPath = "user-code-filter.json" + } + } + metadataCopy { + mergeWithExisting = true + inputTaskNames.add("test") + outputDirectories.add("src/test/resources/META-INF/native-image/io.netty/netty-transport") + } + } + binaries { + test { + buildArgs.add('--allow-incomplete-classpath') + } + } +} \ No newline at end of file diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/gradle.properties b/tests/src/io.netty/netty-transport/4.2.3.Final/gradle.properties new file mode 100644 index 000000000..3b6c4a6e6 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/gradle.properties @@ -0,0 +1,2 @@ +library.version = 4.2.3.Final +metadata.dir = io.netty/netty-transport/4.2.3.Final/ diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/settings.gradle b/tests/src/io.netty/netty-transport/4.2.3.Final/settings.gradle new file mode 100644 index 000000000..19fdf7b26 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + def tckPath = Objects.requireNonNullElse( + System.getenv("GVM_TCK_TCKDIR"), + "../../../../tck-build-logic" + ) + includeBuild(tckPath) +} + +plugins { + id "org.graalvm.internal.tck-settings" version "1.0.0-SNAPSHOT" +} + +rootProject.name = 'io.netty.netty-transport_tests' diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/java/io_netty/netty_transport/Netty_transportTest.java b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/java/io_netty/netty_transport/Netty_transportTest.java new file mode 100644 index 000000000..a122e3f09 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/java/io_netty/netty_transport/Netty_transportTest.java @@ -0,0 +1,299 @@ +/* + * Copyright and related rights waived via CC0 + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see . + */ +package netty; + +import java.io.InputStream; +import java.time.Duration; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; +import java.net.InetSocketAddress; + +import javax.net.ssl.SSLException; + +import io.netty.bootstrap.Bootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpContentCompressor; +import io.netty.handler.codec.http.HttpContentDecompressor; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpRequestDecoder; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.HttpResponseEncoder; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.HttpUtil; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.util.CharsetUtil; +import org.awaitility.Awaitility; +import org.hamcrest.CoreMatchers; +import org.junit.jupiter.api.Test; + +public class Netty_transportTest { + + @Test + void withSsl() throws Exception { + test(true); + } + + @Test + public void noSsl() throws Exception { + test(false); + } + + private void test(boolean ssl) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + int port = startServer(bossGroup, workerGroup, ssl); + AtomicReference response = new AtomicReference<>(); + startClient(workerGroup, ssl, port, response::set); + Awaitility.await().atMost(Duration.ofSeconds(5)) + .untilAtomic(response, CoreMatchers.equalTo(new Response(200, "HTTP/1.1", "Hello World"))); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + private InputStream loadKey() { + return Objects.requireNonNull(Netty_transportTest.class.getResourceAsStream("/key.pem"), "/key.pem not found"); + } + + private InputStream loadCert() { + return Objects.requireNonNull(Netty_transportTest.class.getResourceAsStream("/cert.pem"), "/cert.pem not found"); + } + + private void startClient(EventLoopGroup group, boolean ssl, int port, Consumer callback) throws InterruptedException, SSLException { + SslContext sslContext = null; + if (ssl) { + sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build(); + } + Bootstrap b = new Bootstrap(); + b.group(group).channel(NioSocketChannel.class).handler(new HttpClientInitializer(sslContext, callback)); + Channel ch = b.connect("localhost", port).sync().channel(); + HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/", Unpooled.EMPTY_BUFFER); + request.headers().set(HttpHeaderNames.HOST, "localhost"); + request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE); + ch.writeAndFlush(request); + ch.closeFuture().sync(); + } + + private int startServer(EventLoopGroup bossGroup, EventLoopGroup workerGroup, boolean ssl) throws InterruptedException, SSLException { + SslContext sslContext = null; + if (ssl) { + sslContext = SslContextBuilder.forServer(loadCert(), loadKey(), null).build(); + } + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(new HttpServerInitializer(sslContext)); + + // Bind to port 0 to get a random available port + Channel channel = b.bind(0).sync().channel(); + return ((InetSocketAddress) channel.localAddress()).getPort(); + } + + private static final class HttpClientInitializer extends ChannelInitializer { + + private final SslContext sslContext; + + private final Consumer callback; + + private HttpClientInitializer(SslContext sslContext, Consumer callback) { + this.sslContext = sslContext; + this.callback = callback; + } + + @Override + protected void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + if (sslContext != null) { + p.addLast(sslContext.newHandler(ch.alloc())); + } + p.addLast(new HttpClientCodec()); + p.addLast(new HttpContentDecompressor()); + p.addLast(new HttpObjectAggregator(1048576)); + p.addLast(new HttpClientHandler(this.callback)); + } + } + + private static final class HttpClientHandler extends SimpleChannelInboundHandler { + private final Consumer callback; + + private int status; + + private String protocol; + + private final StringBuilder content = new StringBuilder(); + + private HttpClientHandler(Consumer callback) { + this.callback = callback; + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) { + if (msg instanceof HttpResponse) { + HttpResponse response = (HttpResponse) msg; + this.status = response.status().code(); + this.protocol = response.protocolVersion().toString(); + } + if (msg instanceof HttpContent) { + HttpContent content = (HttpContent) msg; + this.content.append(content.content().toString(CharsetUtil.UTF_8)); + if (content instanceof LastHttpContent) { + this.callback.accept(new Response(this.status, this.protocol, this.content.toString())); + ctx.close(); + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + } + + private static class HttpServerInitializer extends ChannelInitializer { + + private final SslContext sslCtx; + + HttpServerInitializer(SslContext sslCtx) { + this.sslCtx = sslCtx; + } + + @Override + public void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + if (sslCtx != null) { + p.addLast(sslCtx.newHandler(ch.alloc())); + } + p.addLast(new HttpRequestDecoder()); + p.addLast(new HttpObjectAggregator(1048576)); + p.addLast(new HttpResponseEncoder()); + p.addLast(new HttpContentCompressor()); + p.addLast(new HttpServerHandler()); + } + } + + private static class HttpServerHandler extends SimpleChannelInboundHandler { + private boolean keepAlive; + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) { + ctx.flush(); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, Object msg) { + if (msg instanceof HttpRequest) { + HttpRequest request = (HttpRequest) msg; + this.keepAlive = HttpUtil.isKeepAlive(request); + if (HttpUtil.is100ContinueExpected(request)) { + send100Continue(ctx); + } + } + + if (msg instanceof LastHttpContent) { + writeResponse(ctx); + if (!this.keepAlive) { + ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + private void writeResponse(ChannelHandlerContext ctx) { + FullHttpResponse response = new DefaultFullHttpResponse( + HttpVersion.HTTP_1_1, HttpResponseStatus.OK, + Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8)); + if (this.keepAlive) { + response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()); + response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); + } + ctx.write(response); + } + + private static void send100Continue(ChannelHandlerContext ctx) { + FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE, Unpooled.EMPTY_BUFFER); + ctx.write(response); + } + } + + private static class Response { + private final int status; + + private final String protocol; + + private final String content; + + Response(int status, String protocol, String content) { + this.status = status; + this.protocol = protocol; + this.content = content; + } + + @Override + public String toString() { + return "Response{" + + "status=" + status + + ", protocol='" + protocol + '\'' + + ", content='" + content + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Response response = (Response) o; + return status == response.status && Objects.equals(protocol, response.protocol) && Objects.equals(content, response.content); + } + + @Override + public int hashCode() { + return Objects.hash(status, protocol, content); + } + } +} diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/META-INF/native-image/netty-tests/resource-config.json b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/META-INF/native-image/netty-tests/resource-config.json new file mode 100644 index 000000000..e4d9abf00 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/META-INF/native-image/netty-tests/resource-config.json @@ -0,0 +1,13 @@ +{ + "bundles": [], + "resources": { + "includes": [ + { + "pattern": "cert.pem" + }, + { + "pattern": "key.pem" + } + ] + } +} diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/cert.pem b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/cert.pem new file mode 100644 index 000000000..21c38a576 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDjzCCAnegAwIBAgIUO5oHmmf+5qVbly17/26muNYUnzswDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UE +CgwTRGVmYXVsdCBDb21wYW55IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIy +MDQyMTA3NDgwNFoYDzMwMjEwODIyMDc0ODA0WjBWMQswCQYDVQQGEwJYWDEVMBMG +A1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRk +MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDAjRNfsO1LHH/1gZ9sx3YpEXRkA4EHQoUHC4yOn6qYLpR+Rg+rs69D/xUa +7tHUNx0QVLMFPfpKNarNq1ftMlf5pyHQhME40+9fotKSh2o4QCiZmJwdQ54ZiDhk +iIgSFrl/MJVcgyjNjg62/rnvDWbvy4FZvPxMKd2c1A4K/79/gY7N8utar1AKWDJJ +esAB+09+8Z7utUaKBGSXoTXYe+JkZW2/AEeiJRP8PxUnyXJEzEm0vvh/NxHycCS/ +qswOIssbshyDDVw0PKJuEd3oGLn7fK7EFMc9/vR/H7RrSb08qaaLKghIvlwgm3ju +mV4A7cr6bSQ6THKHibheeWfP7W57AgMBAAGjUzBRMB0GA1UdDgQWBBQ5oh+xJQMV +d1Z5eukXsVTPmvmhuzAfBgNVHSMEGDAWgBQ5oh+xJQMVd1Z5eukXsVTPmvmhuzAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCHe/kqkToP6F48hfzn +IpnQ8b6WSoFBeaxddK3EAF53p5WMG0siovn/dulpDmeR9zeajKRZoU/zgHck6tZM +FgiCo7cD3YNjHvgAoCPSWZpU/cPy22fOTS66ht/LUEWzpeih4Zm3vRjUIgcaA93e +RcUDXiyIgP7LOKNwe3R/EDHGmolMC7ZRLWne9P1O3fYcsvVR/aSUjwH0XiLj7D2P +qFr1IxZ1LyAD0jtJ3+FCxDHsaxBO0nTUlKghGeEcl4woqR2fe9IPTxE3Zh7iRMxw +pBdV7EvXeoeBENgavRrYjt+AIwl4FN/HGjW5hdZkP6ZYlMcFSa9WMpQZVfhQzMib +WPBD +-----END CERTIFICATE----- diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/key.pem b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/key.pem new file mode 100644 index 000000000..9c5f23499 --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/src/test/resources/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDAjRNfsO1LHH/1 +gZ9sx3YpEXRkA4EHQoUHC4yOn6qYLpR+Rg+rs69D/xUa7tHUNx0QVLMFPfpKNarN +q1ftMlf5pyHQhME40+9fotKSh2o4QCiZmJwdQ54ZiDhkiIgSFrl/MJVcgyjNjg62 +/rnvDWbvy4FZvPxMKd2c1A4K/79/gY7N8utar1AKWDJJesAB+09+8Z7utUaKBGSX +oTXYe+JkZW2/AEeiJRP8PxUnyXJEzEm0vvh/NxHycCS/qswOIssbshyDDVw0PKJu +Ed3oGLn7fK7EFMc9/vR/H7RrSb08qaaLKghIvlwgm3jumV4A7cr6bSQ6THKHibhe +eWfP7W57AgMBAAECggEAUXyioVGH6syh3m0/4dI70D+ByT2uYjslfwjFMCqkEIlN +8G6H/TsqxhTygpZlGHFGjH270VEcVkGGCkokCM7QamfvqIY2G22dlRScFsTWD/4e +8HmkP8I460c5zln1c+pIEGqoGyGqp+shkRIV7/P1BzBRin+vKjBhiBg55S+8hCG7 +ht5Tpdwr7eTswJhEnIe7By98QesPjHim4Iv2LWoNxGckOxK7rQfTXItEZ8EyiWHk +KuE8342fQXePynAkNYxiqF+skDbDMOaAjE26HrPjSvJcMrh/v3KERALJ/5O/sMTX +FYAYH0UQsiqgQ5eTzJ/u277/xVDRbEjKYsFxe6oHgQKBgQD97saspYY7xEnHB8ku +sFQr/72d+Jf/V88JxIVb8CF8gKQQcqjpUXP9+AMkQ9Bovpcdz8daUS0iftwlAiMW +vKb5/n/awAqhv+f9xRJ4vuLewfXDYVyekNAjnzGTppxwZX4kxbQqUgFr/jYtt+Rs +QatVWggFcXde3THbwFi+6Q3nQQKBgQDCHl+bOGpwtrGomIgC5gs8NPpuSh/1tPY3 +hsbCqZhB2cc/Wnkbb2x5ZRS7Q0TqhhorAqqVtVvA9UOqgjCPUgN2UZMg6ZcGxd+J +C44qCZjJLARnJMJ+DnUpetvcf4uD3cPAXhSTKKc/UXeARFdfwD2QISOsWsjGfZo2 +LGT6yDcCuwKBgQCV6/TGl8+B1+kLJlCkTRzVAV/NNalf61LkXG+0ETlkDXtP7rJF +Vn7aEiSgs50HSodj5Xm4nDa+qBGHlBRtZyJadOS9nSZpyyjIDiNSwLindfKI0SHi +yHLqpSGbIAI65eEtCsDNP69xOBx6r5igRcFHWilkNVKZ4pR+PrjmtigsQQKBgEHY +N6nZCxHMhpqfkpMZIPp9Je0/K3QWu+W9y7HAAStlCZbNw4Kw2uSaituyR7AdaMbq +Ep7Rc5wSFa/ClWIn+ZCqvvNNCLN9bwN3bfOIadDjI2MxLt+/W7KEQAudH9/M21dn +EieQhJqPsa9KfzC1bqxy8TzHVo8tj5+Mk3wVacN9AoGAK8bEoH7umJ9zhvZ63nUA +/Sz5iPYwXVjJGfq6AsGkNJ1ss1315iTt2Z1axKk3yKT17P251e/strBn6smsvi3f +RMnlGcPg9sk6Y8Cx6tQ7e4XosVcKN+Q6ussfLcscDvl7Fj6OuKXyaGUSjDrijr3z +9Mbnz8b5HgISbAM3W3nz+6w= +-----END PRIVATE KEY----- diff --git a/tests/src/io.netty/netty-transport/4.2.3.Final/user-code-filter.json b/tests/src/io.netty/netty-transport/4.2.3.Final/user-code-filter.json new file mode 100644 index 000000000..1cb0fa7fc --- /dev/null +++ b/tests/src/io.netty/netty-transport/4.2.3.Final/user-code-filter.json @@ -0,0 +1,10 @@ +{ + "rules": [ + { + "excludeClasses": "**" + }, + { + "includeClasses": "io.netty.**" + } + ] +} \ No newline at end of file