Add TestStartupIPv6Connectors to verify IPv6 bind
diff --git a/test/org/apache/catalina/startup/TestStartupIPv6Connectors.java b/test/org/apache/catalina/startup/TestStartupIPv6Connectors.java
new file mode 100644
index 0000000..c3c4b9a
--- /dev/null
+++ b/test/org/apache/catalina/startup/TestStartupIPv6Connectors.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.startup;
+
+import java.io.File;
+import java.net.HttpURLConnection;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.URI;
+import java.net.URL;
+import java.util.Enumeration;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+
+public class TestStartupIPv6Connectors extends TomcatBaseTest {
+
+    private static String linklocalAddress;
+    private static String globalAddress;
+
+    @Test
+    public void testIPv6Localhost() throws Exception {
+        assertHttpOkOnAddress("::1");
+    }
+
+    @Test
+    public void testIPv6LinkLocal() throws Exception {
+        Assume.assumeTrue("No IPv6 link-local present", linklocalAddress != null);
+        assertHttpOkOnAddress(linklocalAddress);
+    }
+
+    @Test
+    public void testIPv6Global() throws Exception {
+        Assume.assumeTrue("No IPv6 global-unicast present", globalAddress != null);
+        assertHttpOkOnAddress(globalAddress);
+    }
+
+    @Test
+    public void testIPv6MappedIPv4() throws Exception {
+        assertHttpOkOnAddress("::ffff:127.0.0.1");
+    }
+
+    @BeforeClass
+    public static void initializeTestIpv6Addresses() throws Exception {
+        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+        while (interfaces.hasMoreElements()) {
+            NetworkInterface interf = interfaces.nextElement();
+            Enumeration<InetAddress> addresses = interf.getInetAddresses();
+            while (addresses.hasMoreElements()) {
+                InetAddress address = addresses.nextElement();
+                if (address instanceof Inet6Address inet6Address) {
+                    if (inet6Address.isLinkLocalAddress()) {
+                        linklocalAddress = inet6Address.getHostAddress();
+                    }
+                    if (!inet6Address.isAnyLocalAddress() && !inet6Address.isLoopbackAddress() && !inet6Address.isLinkLocalAddress() && !inet6Address.isMulticastAddress()) {
+                        globalAddress = inet6Address.getHostAddress();
+                    }
+                    if (linklocalAddress != null && globalAddress != null) {
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    private void assertHttpOkOnAddress(String address) throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+        tomcat.getConnector().setProperty("address", address);
+        File baseDir = new File(getTemporaryDirectory(), "ipv6");
+        addDeleteOnTearDown(baseDir);
+        Assert.assertTrue(baseDir.mkdirs() && baseDir.isDirectory());
+        tomcat.setBaseDir(baseDir.getAbsolutePath());
+        Context context = tomcat.addContext("", null);
+        Tomcat.addServlet(context, "simple", new HelloWorldServlet());
+        context.addServletMappingDecoded("/", "simple");
+
+        try {
+            tomcat.start();
+        } catch (Exception e) {
+            Assume.assumeNoException("Can't bind to " + address, e);
+        }
+        if (address.contains(":")) {
+            address = "[" + address + "]";
+        }
+        URL url = new URI("http://" + address + ":" + getPort() + "/").toURL();
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.connect();
+        Assert.assertEquals(HttpServletResponse.SC_OK, connection.getResponseCode());
+        tomcat.stop();
+    }
+}
\ No newline at end of file