IPv6NameserverPlatformParsingTest.java revision 11798:8000249dcb2a
1/* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24import java.lang.reflect.Field; 25import java.util.Hashtable; 26 27import javax.naming.Context; 28import javax.naming.NamingException; 29import javax.naming.spi.NamingManager; 30 31import com.sun.jndi.dns.DnsContext; 32 33/** 34 * @test 35 * @bug 6991580 36 * @summary IPv6 Nameservers in resolv.conf throws NumberFormatException 37 * @run main/manual IPv6NameserverPlatformParsingTest 38 * 39 * In order to run this test be sure to place, for example, the following 40 * snippet into your platform's {@code /etc/resolv.conf}: 41 * <pre> 42 * nameserver 127.0.0.1 43 * nameserver 2001:4860:4860::8888 44 * nameserver [::1]:5353 45 * nameserver 127.0.0.1:5353 46 * </pre> 47 * 48 * Then, run this test as manual jtreg test. 49 * 50 * @author Severin Gehwolf 51 * 52 */ 53public class IPv6NameserverPlatformParsingTest { 54 55 private static boolean foundIPv6 = false; 56 57 public static void main(String[] args) { 58 Hashtable<String, String> env = new Hashtable<>(); 59 env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.dns.DnsContextFactory.class.getName()); 60 61 String[] servers; 62 try { 63 Context ctx = NamingManager.getInitialContext(env); 64 if (!com.sun.jndi.dns.DnsContextFactory.platformServersAvailable()) { 65 throw new RuntimeException("FAIL: no platform servers available, test does not make sense"); 66 } 67 DnsContext context = (DnsContext)ctx; 68 servers = getServersFromContext(context); 69 } catch (NamingException e) { 70 throw new RuntimeException(e); 71 } 72 for (String server: servers) { 73 System.out.println("DEBUG: 'nameserver = " + server + "'"); 74 if (server.indexOf(':') >= 0 && server.indexOf('.') < 0) { 75 System.out.println("DEBUG: ==> Found IPv6 address in servers list: " + server); 76 foundIPv6 = true; 77 } 78 } 79 try { 80 new com.sun.jndi.dns.DnsClient(servers, 100, 1); 81 } catch (NumberFormatException e) { 82 throw new RuntimeException("FAIL: Tried to parse non-[]-encapsulated IPv6 address.", e); 83 } catch (Exception e) { 84 throw new RuntimeException("ERROR: Something unexpected happened."); 85 } 86 if (!foundIPv6) { 87 // This is a manual test, since it requires changing /etc/resolv.conf on Linux/Unix 88 // platforms. See comment as to how to run this test. 89 throw new RuntimeException("ERROR: No IPv6 address returned from platform."); 90 } 91 System.out.println("PASS: Found IPv6 address and DnsClient parsed it correctly."); 92 } 93 94 private static String[] getServersFromContext(DnsContext context) { 95 try { 96 Field serversField = DnsContext.class.getDeclaredField("servers"); 97 serversField.setAccessible(true); 98 return (String[])serversField.get(context); 99 } catch (Exception e) { 100 throw new RuntimeException(e); 101 } 102 } 103 104} 105