From 861651892abefc94b459d6fd78c4172372ec9643 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fridrich=20=C5=A0trba?= <fridrich.strba@bluewin.ch>
Date: Thu, 11 Feb 2021 12:46:20 +0100
Subject: [PATCH 6/7] revert Fix native image build...

---
 .../src/main/java/io/netty/util/NetUtil.java  | 114 +++++++++++-
 .../io/netty/util/NetUtilInitializations.java | 172 ------------------
 .../io/netty/util/NetUtilSubstitutions.java   |  90 ---------
 .../io.netty/common/native-image.properties   |   5 +-
 pom.xml                                       |   2 -
 .../resolver-dns/native-image.properties      |  18 --
 .../pom.xml                                   | 102 -----------
 .../NativeClientWithNettyInitAtRuntime.java   |  36 ----
 .../testsuite/svm/client/package-info.java    |  21 ---
 testsuite-native-image-client/pom.xml         | 108 -----------
 .../testsuite/svm/client/DnsNativeClient.java |  48 -----
 .../testsuite/svm/client/package-info.java    |  20 --
 .../src/main/resources/reflection-config.json |   8 -
 .../socket/InternetProtocolFamily.java        |  17 +-
 .../socket/InternetProtocolFamilyTest.java    |  36 ----
 15 files changed, 115 insertions(+), 682 deletions(-)
 delete mode 100644 common/src/main/java/io/netty/util/NetUtilInitializations.java
 delete mode 100644 common/src/main/java/io/netty/util/NetUtilSubstitutions.java
 delete mode 100644 resolver-dns/src/main/resources/META-INF/native-image/io.netty/resolver-dns/native-image.properties
 delete mode 100644 testsuite-native-image-client-runtime-init/pom.xml
 delete mode 100644 testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/NativeClientWithNettyInitAtRuntime.java
 delete mode 100644 testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/package-info.java
 delete mode 100644 testsuite-native-image-client/pom.xml
 delete mode 100644 testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/DnsNativeClient.java
 delete mode 100644 testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/package-info.java
 delete mode 100644 testsuite-native-image-client/src/main/resources/reflection-config.json
 delete mode 100644 transport/src/test/java/io/netty/channel/socket/InternetProtocolFamilyTest.java

diff --git a/common/src/main/java/io/netty/util/NetUtil.java b/common/src/main/java/io/netty/util/NetUtil.java
index 3d2744f745..687b2b7cc9 100644
--- a/common/src/main/java/io/netty/util/NetUtil.java
+++ b/common/src/main/java/io/netty/util/NetUtil.java
@@ -15,8 +15,8 @@
  */
 package io.netty.util;
 
-import io.netty.util.NetUtilInitializations.NetworkIfaceAndInetAddress;
 import io.netty.util.internal.PlatformDependent;
+import io.netty.util.internal.SocketUtils;
 import io.netty.util.internal.StringUtil;
 import io.netty.util.internal.SystemPropertyUtil;
 import io.netty.util.internal.logging.InternalLogger;
@@ -33,10 +33,14 @@ import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.NetworkInterface;
+import java.net.SocketException;
 import java.net.UnknownHostException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
 
 import static io.netty.util.AsciiString.indexOf;
 
@@ -136,15 +140,113 @@ public final class NetUtil {
         logger.debug("-Djava.net.preferIPv4Stack: {}", IPV4_PREFERRED);
         logger.debug("-Djava.net.preferIPv6Addresses: {}", IPV6_ADDRESSES_PREFERRED);
 
+        byte[] LOCALHOST4_BYTES = {127, 0, 0, 1};
+        byte[] LOCALHOST6_BYTES = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+
         // Create IPv4 loopback address.
-        LOCALHOST4 = NetUtilInitializations.createLocalhost4();
+        Inet4Address localhost4 = null;
+        try {
+            localhost4 = (Inet4Address) InetAddress.getByAddress("localhost", LOCALHOST4_BYTES);
+        } catch (Exception e) {
+            // We should not get here as long as the length of the address is correct.
+            PlatformDependent.throwException(e);
+        }
+        LOCALHOST4 = localhost4;
 
         // Create IPv6 loopback address.
-        LOCALHOST6 = NetUtilInitializations.createLocalhost6();
+        Inet6Address localhost6 = null;
+        try {
+            localhost6 = (Inet6Address) InetAddress.getByAddress("localhost", LOCALHOST6_BYTES);
+        } catch (Exception e) {
+            // We should not get here as long as the length of the address is correct.
+            PlatformDependent.throwException(e);
+        }
+        LOCALHOST6 = localhost6;
+
+        // Retrieve the list of available network interfaces.
+        List<NetworkInterface> ifaces = new ArrayList<NetworkInterface>();
+        try {
+            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+            if (interfaces != null) {
+                while (interfaces.hasMoreElements()) {
+                    NetworkInterface iface = interfaces.nextElement();
+                    // Use the interface with proper INET addresses only.
+                    if (SocketUtils.addressesFromNetworkInterface(iface).hasMoreElements()) {
+                        ifaces.add(iface);
+                    }
+                }
+            }
+        } catch (SocketException e) {
+            logger.warn("Failed to retrieve the list of available network interfaces", e);
+        }
+
+        // Find the first loopback interface available from its INET address (127.0.0.1 or ::1)
+        // Note that we do not use NetworkInterface.isLoopback() in the first place because it takes long time
+        // on a certain environment. (e.g. Windows with -Djava.net.preferIPv4Stack=true)
+        NetworkInterface loopbackIface = null;
+        InetAddress loopbackAddr = null;
+        loop: for (NetworkInterface iface: ifaces) {
+            for (Enumeration<InetAddress> i = SocketUtils.addressesFromNetworkInterface(iface); i.hasMoreElements();) {
+                InetAddress addr = i.nextElement();
+                if (addr.isLoopbackAddress()) {
+                    // Found
+                    loopbackIface = iface;
+                    loopbackAddr = addr;
+                    break loop;
+                }
+            }
+        }
+
+        // If failed to find the loopback interface from its INET address, fall back to isLoopback().
+        if (loopbackIface == null) {
+            try {
+                for (NetworkInterface iface: ifaces) {
+                    if (iface.isLoopback()) {
+                        Enumeration<InetAddress> i = SocketUtils.addressesFromNetworkInterface(iface);
+                        if (i.hasMoreElements()) {
+                            // Found the one with INET address.
+                            loopbackIface = iface;
+                            loopbackAddr = i.nextElement();
+                            break;
+                        }
+                    }
+                }
+
+                if (loopbackIface == null) {
+                    logger.warn("Failed to find the loopback interface");
+                }
+            } catch (SocketException e) {
+                logger.warn("Failed to find the loopback interface", e);
+            }
+        }
+
+        if (loopbackIface != null) {
+            // Found the loopback interface with an INET address.
+            logger.debug(
+                    "Loopback interface: {} ({}, {})",
+                    loopbackIface.getName(), loopbackIface.getDisplayName(), loopbackAddr.getHostAddress());
+        } else {
+            // Could not find the loopback interface, but we can't leave LOCALHOST as null.
+            // Use LOCALHOST6 or LOCALHOST4, preferably the IPv6 one.
+            if (loopbackAddr == null) {
+                try {
+                    if (NetworkInterface.getByInetAddress(LOCALHOST6) != null) {
+                        logger.debug("Using hard-coded IPv6 localhost address: {}", localhost6);
+                        loopbackAddr = localhost6;
+                    }
+                } catch (Exception e) {
+                    // Ignore
+                } finally {
+                    if (loopbackAddr == null) {
+                        logger.debug("Using hard-coded IPv4 localhost address: {}", localhost4);
+                        loopbackAddr = localhost4;
+                    }
+                }
+            }
+        }
 
-        NetworkIfaceAndInetAddress loopback = NetUtilInitializations.determineLoopback(LOCALHOST4, LOCALHOST6);
-        LOOPBACK_IF = loopback.iface();
-        LOCALHOST = loopback.address();
+        LOOPBACK_IF = loopbackIface;
+        LOCALHOST = loopbackAddr;
 
         // As a SecurityManager may prevent reading the somaxconn file we wrap this in a privileged block.
         //
diff --git a/common/src/main/java/io/netty/util/NetUtilInitializations.java b/common/src/main/java/io/netty/util/NetUtilInitializations.java
deleted file mode 100644
index f2d65a5c6e..0000000000
--- a/common/src/main/java/io/netty/util/NetUtilInitializations.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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 io.netty.util;
-
-import io.netty.util.internal.PlatformDependent;
-import io.netty.util.internal.SocketUtils;
-import io.netty.util.internal.logging.InternalLogger;
-import io.netty.util.internal.logging.InternalLoggerFactory;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-final class NetUtilInitializations {
-    /**
-     * The logger being used by this class
-     */
-    private static final InternalLogger logger = InternalLoggerFactory.getInstance(NetUtilInitializations.class);
-
-    private NetUtilInitializations() {
-    }
-
-    static Inet4Address createLocalhost4() {
-        byte[] LOCALHOST4_BYTES = {127, 0, 0, 1};
-
-        Inet4Address localhost4 = null;
-        try {
-            localhost4 = (Inet4Address) InetAddress.getByAddress("localhost", LOCALHOST4_BYTES);
-        } catch (Exception e) {
-            // We should not get here as long as the length of the address is correct.
-            PlatformDependent.throwException(e);
-        }
-
-        return localhost4;
-    }
-
-    static Inet6Address createLocalhost6() {
-        byte[] LOCALHOST6_BYTES = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
-
-        Inet6Address localhost6 = null;
-        try {
-            localhost6 = (Inet6Address) InetAddress.getByAddress("localhost", LOCALHOST6_BYTES);
-        } catch (Exception e) {
-            // We should not get here as long as the length of the address is correct.
-            PlatformDependent.throwException(e);
-        }
-
-        return localhost6;
-    }
-
-    static NetworkIfaceAndInetAddress determineLoopback(Inet4Address localhost4, Inet6Address localhost6) {
-        // Retrieve the list of available network interfaces.
-        List<NetworkInterface> ifaces = new ArrayList<NetworkInterface>();
-        try {
-            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
-            if (interfaces != null) {
-                while (interfaces.hasMoreElements()) {
-                    NetworkInterface iface = interfaces.nextElement();
-                    // Use the interface with proper INET addresses only.
-                    if (SocketUtils.addressesFromNetworkInterface(iface).hasMoreElements()) {
-                        ifaces.add(iface);
-                    }
-                }
-            }
-        } catch (SocketException e) {
-            logger.warn("Failed to retrieve the list of available network interfaces", e);
-        }
-
-        // Find the first loopback interface available from its INET address (127.0.0.1 or ::1)
-        // Note that we do not use NetworkInterface.isLoopback() in the first place because it takes long time
-        // on a certain environment. (e.g. Windows with -Djava.net.preferIPv4Stack=true)
-        NetworkInterface loopbackIface = null;
-        InetAddress loopbackAddr = null;
-        loop: for (NetworkInterface iface: ifaces) {
-            for (Enumeration<InetAddress> i = SocketUtils.addressesFromNetworkInterface(iface); i.hasMoreElements();) {
-                InetAddress addr = i.nextElement();
-                if (addr.isLoopbackAddress()) {
-                    // Found
-                    loopbackIface = iface;
-                    loopbackAddr = addr;
-                    break loop;
-                }
-            }
-        }
-
-        // If failed to find the loopback interface from its INET address, fall back to isLoopback().
-        if (loopbackIface == null) {
-            try {
-                for (NetworkInterface iface: ifaces) {
-                    if (iface.isLoopback()) {
-                        Enumeration<InetAddress> i = SocketUtils.addressesFromNetworkInterface(iface);
-                        if (i.hasMoreElements()) {
-                            // Found the one with INET address.
-                            loopbackIface = iface;
-                            loopbackAddr = i.nextElement();
-                            break;
-                        }
-                    }
-                }
-
-                if (loopbackIface == null) {
-                    logger.warn("Failed to find the loopback interface");
-                }
-            } catch (SocketException e) {
-                logger.warn("Failed to find the loopback interface", e);
-            }
-        }
-
-        if (loopbackIface != null) {
-            // Found the loopback interface with an INET address.
-            logger.debug(
-                    "Loopback interface: {} ({}, {})",
-                    loopbackIface.getName(), loopbackIface.getDisplayName(), loopbackAddr.getHostAddress());
-        } else {
-            // Could not find the loopback interface, but we can't leave LOCALHOST as null.
-            // Use LOCALHOST6 or LOCALHOST4, preferably the IPv6 one.
-            if (loopbackAddr == null) {
-                try {
-                    if (NetworkInterface.getByInetAddress(localhost6) != null) {
-                        logger.debug("Using hard-coded IPv6 localhost address: {}", localhost6);
-                        loopbackAddr = localhost6;
-                    }
-                } catch (Exception e) {
-                    // Ignore
-                } finally {
-                    if (loopbackAddr == null) {
-                        logger.debug("Using hard-coded IPv4 localhost address: {}", localhost4);
-                        loopbackAddr = localhost4;
-                    }
-                }
-            }
-        }
-
-        return new NetworkIfaceAndInetAddress(loopbackIface, loopbackAddr);
-    }
-
-    static final class NetworkIfaceAndInetAddress {
-        private final NetworkInterface iface;
-        private final InetAddress address;
-
-        NetworkIfaceAndInetAddress(NetworkInterface iface, InetAddress address) {
-            this.iface = iface;
-            this.address = address;
-        }
-
-        public NetworkInterface iface() {
-            return iface;
-        }
-
-        public InetAddress address() {
-            return address;
-        }
-    }
-}
diff --git a/common/src/main/java/io/netty/util/NetUtilSubstitutions.java b/common/src/main/java/io/netty/util/NetUtilSubstitutions.java
deleted file mode 100644
index 7894037e4e..0000000000
--- a/common/src/main/java/io/netty/util/NetUtilSubstitutions.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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 io.netty.util;
-
-import com.oracle.svm.core.annotate.Alias;
-import com.oracle.svm.core.annotate.InjectAccessors;
-import com.oracle.svm.core.annotate.TargetClass;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-
-@TargetClass(NetUtil.class)
-final class NetUtilSubstitutions {
-    private NetUtilSubstitutions() {
-    }
-
-    @Alias
-    @InjectAccessors(NetUtilLocalhost4Accessor.class)
-    public static Inet4Address LOCALHOST4;
-
-    @Alias
-    @InjectAccessors(NetUtilLocalhost6Accessor.class)
-    public static Inet6Address LOCALHOST6;
-
-    @Alias
-    @InjectAccessors(NetUtilLocalhostAccessor.class)
-    public static InetAddress LOCALHOST;
-
-    private static final class NetUtilLocalhost4Accessor {
-        static Inet4Address get() {
-            // using https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
-            return NetUtilLocalhost4LazyHolder.LOCALHOST4;
-        }
-
-        static void set(Inet4Address ignored) {
-            // a no-op setter to avoid exceptions when NetUtil is initialized at run-time
-        }
-    }
-
-    private static final class NetUtilLocalhost4LazyHolder {
-        private static final Inet4Address LOCALHOST4 = NetUtilInitializations.createLocalhost4();
-    }
-
-    private static final class NetUtilLocalhost6Accessor {
-        static Inet6Address get() {
-            // using https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
-            return NetUtilLocalhost6LazyHolder.LOCALHOST6;
-        }
-
-        static void set(Inet6Address ignored) {
-            // a no-op setter to avoid exceptions when NetUtil is initialized at run-time
-        }
-    }
-
-    private static final class NetUtilLocalhost6LazyHolder {
-        private static final Inet6Address LOCALHOST6 = NetUtilInitializations.createLocalhost6();
-    }
-
-    private static final class NetUtilLocalhostAccessor {
-        static InetAddress get() {
-            // using https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
-            return NetUtilLocalhostLazyHolder.LOCALHOST;
-        }
-
-        static void set(InetAddress ignored) {
-            // a no-op setter to avoid exceptions when NetUtil is initialized at run-time
-        }
-    }
-
-    private static final class NetUtilLocalhostLazyHolder {
-        private static final InetAddress LOCALHOST = NetUtilInitializations
-                .determineLoopback(NetUtilLocalhost4LazyHolder.LOCALHOST4, NetUtilLocalhost6LazyHolder.LOCALHOST6)
-                .address();
-    }
-}
-
diff --git a/common/src/main/resources/META-INF/native-image/io.netty/common/native-image.properties b/common/src/main/resources/META-INF/native-image/io.netty/common/native-image.properties
index d2f607f492..1e4620fab2 100644
--- a/common/src/main/resources/META-INF/native-image/io.netty/common/native-image.properties
+++ b/common/src/main/resources/META-INF/native-image/io.netty/common/native-image.properties
@@ -12,7 +12,4 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-Args = --initialize-at-run-time=io.netty.util.AbstractReferenceCounted,io.netty.util.concurrent.GlobalEventExecutor,io.netty.util.concurrent.ImmediateEventExecutor,io.netty.util.concurrent.ScheduledFutureTask,io.netty.util.internal.ThreadLocalRandom \
-       --initialize-at-run-time=io.netty.util.NetUtilSubstitutions$NetUtilLocalhost4LazyHolder \
-       --initialize-at-run-time=io.netty.util.NetUtilSubstitutions$NetUtilLocalhost6LazyHolder \
-       --initialize-at-run-time=io.netty.util.NetUtilSubstitutions$NetUtilLocalhostLazyHolder
+Args = --initialize-at-run-time=io.netty.util.AbstractReferenceCounted,io.netty.util.concurrent.GlobalEventExecutor,io.netty.util.concurrent.ImmediateEventExecutor,io.netty.util.concurrent.ScheduledFutureTask,io.netty.util.internal.ThreadLocalRandom
diff --git a/pom.xml b/pom.xml
index c743bd97f3..781ba61ba0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -609,8 +609,6 @@
     <module>testsuite-shading</module>
     <module>testsuite-native</module>
     <module>testsuite-native-image</module>
-    <module>testsuite-native-image-client</module>
-    <module>testsuite-native-image-client-runtime-init</module>
     <module>microbench</module>
     <module>bom</module>
   </modules>
diff --git a/resolver-dns/src/main/resources/META-INF/native-image/io.netty/resolver-dns/native-image.properties b/resolver-dns/src/main/resources/META-INF/native-image/io.netty/resolver-dns/native-image.properties
deleted file mode 100644
index 43af984157..0000000000
--- a/resolver-dns/src/main/resources/META-INF/native-image/io.netty/resolver-dns/native-image.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2020 The Netty Project
-#
-# The Netty Project 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:
-#
-#   https://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.
-
-Args = --initialize-at-run-time=io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider \
-       --initialize-at-run-time=io.netty.resolver.dns.DnsServerAddressStreamProviders$DefaultProviderHolder \
-       --initialize-at-run-time=io.netty.resolver.dns.DnsNameResolver \
-       --initialize-at-run-time=io.netty.resolver.HostsFileEntriesResolver
diff --git a/testsuite-native-image-client-runtime-init/pom.xml b/testsuite-native-image-client-runtime-init/pom.xml
deleted file mode 100644
index 3e7b50069f..0000000000
--- a/testsuite-native-image-client-runtime-init/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2020 The Netty Project
-  ~
-  ~ The Netty Project 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:
-  ~
-  ~   https://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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>io.netty</groupId>
-    <artifactId>netty-parent</artifactId>
-    <version>4.1.75.Final</version>
-  </parent>
-
-  <artifactId>netty-testsuite-native-image-client-runtime-init</artifactId>
-  <packaging>jar</packaging>
-
-  <name>Netty/Testsuite/NativeImage/ClientRuntimeInit</name>
-
-  <properties>
-    <japicmp.skip>true</japicmp.skip>
-    <!-- Do not deploy this module -->
-    <skipDeploy>true</skipDeploy>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
-
-  <profiles>
-    <profile>
-      <id>skipTests</id>
-      <activation>
-        <property>
-          <name>skipTests</name>
-        </property>
-      </activation>
-      <properties>
-        <skipNativeImageTestsuite>true</skipNativeImageTestsuite>
-      </properties>
-    </profile>
-  </profiles>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.graalvm.nativeimage</groupId>
-        <artifactId>native-image-maven-plugin</artifactId>
-        <version>${graalvm.version}</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>native-image</goal>
-            </goals>
-            <phase>package</phase>
-          </execution>
-        </executions>
-        <configuration>
-          <skip>${skipNativeImageTestsuite}</skip>
-          <imageName>${project.artifactId}</imageName>
-          <mainClass>io.netty.testsuite.svm.client.NativeClientWithNettyInitAtRuntime</mainClass>
-          <buildArgs>--report-unsupported-elements-at-runtime --allow-incomplete-classpath --no-fallback --initialize-at-run-time=io.netty.util.NetUtil</buildArgs>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.6.0</version>
-        <executions>
-          <!-- This will do a whitesmoke test: if the substitutions are missing the binary will fail to run -->
-          <!-- If the metadata is missing the build above will fail -->
-          <execution>
-            <id>verify-native-image</id>
-            <phase>verify</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <skip>${skipNativeImageTestsuite}</skip>
-          <executable>${project.build.directory}/${project.artifactId}</executable>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/NativeClientWithNettyInitAtRuntime.java b/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/NativeClientWithNettyInitAtRuntime.java
deleted file mode 100644
index 6c4aa22ba8..0000000000
--- a/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/NativeClientWithNettyInitAtRuntime.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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 io.netty.testsuite.svm.client;
-
-import io.netty.util.NetUtil;
-
-/**
- * A client that triggers runtime initialization of NetUtil when
- * built to a native image.
- */
-public final class NativeClientWithNettyInitAtRuntime {
-    /**
-     * Main entry point (not instantiable)
-     */
-    private NativeClientWithNettyInitAtRuntime() {
-    }
-
-    public static void main(String[] args) {
-        System.out.println(NetUtil.LOCALHOST4);
-        System.out.println(NetUtil.LOCALHOST6);
-        System.out.println(NetUtil.LOCALHOST);
-    }
-}
diff --git a/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/package-info.java b/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/package-info.java
deleted file mode 100644
index c5d8a74b31..0000000000
--- a/testsuite-native-image-client-runtime-init/src/main/java/io/netty/testsuite/svm/client/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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.
- */
-
-/**
- * A client that triggers runtime initialization of NetUtil when
- * built to a native image.
- */
-package io.netty.testsuite.svm.client;
diff --git a/testsuite-native-image-client/pom.xml b/testsuite-native-image-client/pom.xml
deleted file mode 100644
index 6bd531f954..0000000000
--- a/testsuite-native-image-client/pom.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2020 The Netty Project
-  ~
-  ~ The Netty Project 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:
-  ~
-  ~   https://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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>io.netty</groupId>
-    <artifactId>netty-parent</artifactId>
-    <version>4.1.75.Final</version>
-  </parent>
-
-  <artifactId>netty-testsuite-native-image-client</artifactId>
-  <packaging>jar</packaging>
-
-  <name>Netty/Testsuite/NativeImage/Client</name>
-
-  <properties>
-    <japicmp.skip>true</japicmp.skip>
-    <!-- Do not deploy this module -->
-    <skipDeploy>true</skipDeploy>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-transport</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-resolver-dns</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-  </dependencies>
-
-  <profiles>
-    <profile>
-      <id>skipTests</id>
-      <activation>
-        <property>
-          <name>skipTests</name>
-        </property>
-      </activation>
-      <properties>
-        <skipNativeImageTestsuite>true</skipNativeImageTestsuite>
-      </properties>
-    </profile>
-  </profiles>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.graalvm.nativeimage</groupId>
-        <artifactId>native-image-maven-plugin</artifactId>
-        <version>${graalvm.version}</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>native-image</goal>
-            </goals>
-            <phase>package</phase>
-          </execution>
-        </executions>
-        <configuration>
-          <skip>${skipNativeImageTestsuite}</skip>
-          <imageName>${project.artifactId}</imageName>
-          <mainClass>io.netty.testsuite.svm.client.DnsNativeClient</mainClass>
-          <buildArgs>--report-unsupported-elements-at-runtime --allow-incomplete-classpath --no-fallback --initialize-at-build-time=io.netty -H:ReflectionConfigurationResources=reflection-config.json</buildArgs>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.6.0</version>
-        <executions>
-          <!-- This will do a whitesmoke test: if the substitutions are missing the binary will fail to run -->
-          <!-- If the metadata is missing the build above will fail -->
-          <execution>
-            <id>verify-native-image</id>
-            <phase>verify</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <skip>${skipNativeImageTestsuite}</skip>
-          <executable>${project.build.directory}/${project.artifactId}</executable>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/DnsNativeClient.java b/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/DnsNativeClient.java
deleted file mode 100644
index afbbd61eb1..0000000000
--- a/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/DnsNativeClient.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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 io.netty.testsuite.svm.client;
-
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioDatagramChannel;
-import io.netty.resolver.AddressResolver;
-import io.netty.resolver.dns.DnsAddressResolverGroup;
-import io.netty.resolver.dns.DnsServerAddressStreamProviders;
-import io.netty.util.concurrent.DefaultThreadFactory;
-
-import java.net.InetSocketAddress;
-
-/**
- * A client that uses netty-dns and gets compiled to a native image.
- */
-public final class DnsNativeClient {
-    /**
-     * Main entry point (not instantiable)
-     */
-    private DnsNativeClient() {
-    }
-
-    public static void main(String[] args) throws Exception {
-        NioEventLoopGroup group = new NioEventLoopGroup(1, new DefaultThreadFactory("netty"));
-
-        DnsAddressResolverGroup resolverGroup = new DnsAddressResolverGroup(NioDatagramChannel.class,
-                DnsServerAddressStreamProviders.platformDefault());
-        AddressResolver<InetSocketAddress> resolver = resolverGroup.getResolver(group.next());
-        System.out.println(resolver);
-
-        resolver.close();
-        group.shutdownGracefully().get();
-    }
-}
diff --git a/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/package-info.java b/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/package-info.java
deleted file mode 100644
index 7b575e6835..0000000000
--- a/testsuite-native-image-client/src/main/java/io/netty/testsuite/svm/client/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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.
- */
-
-/**
- * A client that uses netty-dns and gets compiled to a native image.
- */
-package io.netty.testsuite.svm.client;
diff --git a/testsuite-native-image-client/src/main/resources/reflection-config.json b/testsuite-native-image-client/src/main/resources/reflection-config.json
deleted file mode 100644
index 2d1c8edff5..0000000000
--- a/testsuite-native-image-client/src/main/resources/reflection-config.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
-    {
-      "name": "io.netty.channel.socket.nio.NioDatagramChannel",
-      "methods": [
-        { "name": "<init>", "parameterTypes": [] }
-      ]
-    }
-]
diff --git a/transport/src/main/java/io/netty/channel/socket/InternetProtocolFamily.java b/transport/src/main/java/io/netty/channel/socket/InternetProtocolFamily.java
index 57f7cf7d2c..369cdd28b5 100644
--- a/transport/src/main/java/io/netty/channel/socket/InternetProtocolFamily.java
+++ b/transport/src/main/java/io/netty/channel/socket/InternetProtocolFamily.java
@@ -25,15 +25,17 @@ import java.net.InetAddress;
  * Internet Protocol (IP) families used byte the {@link DatagramChannel}
  */
 public enum InternetProtocolFamily {
-    IPv4(Inet4Address.class, 1),
-    IPv6(Inet6Address.class, 2);
+    IPv4(Inet4Address.class, 1, NetUtil.LOCALHOST4),
+    IPv6(Inet6Address.class, 2, NetUtil.LOCALHOST6);
 
     private final Class<? extends InetAddress> addressType;
     private final int addressNumber;
+    private final InetAddress localHost;
 
-    InternetProtocolFamily(Class<? extends InetAddress> addressType, int addressNumber) {
+    InternetProtocolFamily(Class<? extends InetAddress> addressType, int addressNumber, InetAddress localHost) {
         this.addressType = addressType;
         this.addressNumber = addressNumber;
+        this.localHost = localHost;
     }
 
     /**
@@ -56,14 +58,7 @@ public enum InternetProtocolFamily {
      * Returns the {@link InetAddress} that represent the {@code LOCALHOST} for the family.
      */
     public InetAddress localhost() {
-        switch (this) {
-            case IPv4:
-                return NetUtil.LOCALHOST4;
-            case IPv6:
-                return NetUtil.LOCALHOST6;
-            default:
-                throw new IllegalStateException("Unsupported family " + this);
-        }
+        return localHost;
     }
 
     /**
diff --git a/transport/src/test/java/io/netty/channel/socket/InternetProtocolFamilyTest.java b/transport/src/test/java/io/netty/channel/socket/InternetProtocolFamilyTest.java
deleted file mode 100644
index 6fe225b850..0000000000
--- a/transport/src/test/java/io/netty/channel/socket/InternetProtocolFamilyTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2020 The Netty Project
- *
- * The Netty Project 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:
- *
- *   https://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 io.netty.channel.socket;
-
-import io.netty.util.NetUtil;
-import org.junit.jupiter.api.Test;
-
-import java.net.InetAddress;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-public class InternetProtocolFamilyTest {
-    @Test
-    public void ipv4ShouldHaveLocalhostOfIpV4() {
-        assertThat(InternetProtocolFamily.IPv4.localhost(), is((InetAddress) NetUtil.LOCALHOST4));
-    }
-
-    @Test
-    public void ipv6ShouldHaveLocalhostOfIpV6() {
-        assertThat(InternetProtocolFamily.IPv6.localhost(), is((InetAddress) NetUtil.LOCALHOST6));
-    }
-}
-- 
2.35.1

