1 /*
2  * Copyright (c) 2016, 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 
24 /* @test
25  * @bug 8134577
26  * @summary Test the internal NameService implementation which is enabled via
27  *          the system property jdk.net.hosts.file. This property specifies
28  *          a file name that contains address host mappings, similar to those in
29  *          /etc/hosts file.
30  * @run main/othervm  InternalNameServiceTest
31  */
32 
33 import java.io.BufferedWriter;
34 import java.io.FileWriter;
35 import java.io.PrintWriter;
36 import java.net.InetAddress;
37 import java.net.UnknownHostException;
38 import java.util.Arrays;
39 
40 public class InternalNameServiceTest {
41 
main(String args[])42     public static void main(String args[]) throws Exception {
43 
44         String hostsFileName = System.getProperty("test.src", ".") + "/TestHosts";
45         System.setProperty("jdk.net.hosts.file", hostsFileName);
46         System.setProperty("sun.net.inetaddr.ttl", "0");
47 
48         testHostToIPAddressMappings(hostsFileName);
49         testIpAddressToHostNameMappings(hostsFileName);
50     }
51 
testHostToIPAddressMappings(String hostsFileName)52     private static void testHostToIPAddressMappings(String hostsFileName)
53             throws Exception, UnknownHostException {
54         System.out.println(" TEST HOST TO  IP ADDRESS MAPPINGS ");
55         InetAddress testAddress;
56         byte[] retrievedIpAddr;
57         byte[] expectedIpAddr1 = { 1, 2, 3, 4 };
58         byte[] expectedIpAddr2 = { 5, 6, 7, 8 };
59         byte[] expectedIpAddrIpv6_1 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
60 
61         // hosts file with
62         // # test hosts file for internal NameService
63         // 1.2.3.4 host.sample-domain
64         // 5.6.7.8 host1.sample-domain
65         // 1.2.3.4 host2.sample-domain  # this is a comment
66         // host3.sample-domain # no ip address
67         //  host4.sample-domain # space as ip address
68         //   host5.sample-domain # double space as ip address
69 
70         // add comment to hosts file
71         addMappingToHostsFile("test hosts file for internal NameService ", "#", hostsFileName,
72                 false);
73         addMappingToHostsFile("host.sample-domain", "1.2.3.4", hostsFileName,
74                 true);
75 
76         testAddress = InetAddress.getByName("host.sample-domain");
77         retrievedIpAddr = testAddress.getAddress();
78         if (!Arrays.equals(retrievedIpAddr, expectedIpAddr1)) {
79             throw new RuntimeException(
80                     "retrievedIpAddr not equal to expectedipAddr");
81         }
82 
83         addMappingToHostsFile("host1.sample-domain", "5.6.7.8", hostsFileName,
84                 true);
85         addMappingToHostsFile("host2.sample-domain", "1.2.3.4", hostsFileName,
86                 true);
87 
88         testAddress = InetAddress.getByName("host1.sample-domain");
89         retrievedIpAddr = testAddress.getAddress();
90         if (!Arrays.equals(retrievedIpAddr, expectedIpAddr2)) {
91             throw new RuntimeException(
92                     "retrievedIpAddr not equal to expectedIpAddr");
93         }
94 
95         testAddress = InetAddress.getByName("host2.sample-domain");
96         retrievedIpAddr = testAddress.getAddress();
97         if (!Arrays.equals(retrievedIpAddr, expectedIpAddr1)) {
98             throw new RuntimeException(
99                     "retrievedIpAddr not equal to expectedIpAddr");
100         }
101 
102         try {
103             addMappingToHostsFile("host3.sample-domain", "", hostsFileName,
104                     true);
105             testAddress = InetAddress.getByName("host3.sample-domain");
106             throw new RuntimeException(
107                     "Expected UnknownHostException not thrown");
108         } catch (UnknownHostException uhEx) {
109             System.out.println("UnknownHostException as expected for host host3.sample-domain");
110         }
111 
112         try {
113             addMappingToHostsFile("host4.sample-domain", " ", hostsFileName,
114                     true);
115             testAddress = InetAddress.getByName("host4.sample-domain");
116             throw new RuntimeException(
117                     "Expected UnknownHostException not thrown");
118         } catch (UnknownHostException uhEx) {
119             System.out.println("UnknownHostException as expected for host host4.sample-domain");
120         }
121 
122         try {
123             addMappingToHostsFile("host5.sample-domain", "  ", hostsFileName,
124                     true);
125             testAddress = InetAddress.getByName("host4.sample-domain");
126             throw new RuntimeException(
127                     "Expected UnknownHostException not thrown");
128         } catch (UnknownHostException uhEx) {
129             System.out.println("UnknownHostException as expected for host host5.sample-domain");
130         }
131 
132         // IPV6 tests
133 
134         // IPV6 tests
135         addMappingToHostsFile("host-ipv6.sample-domain", "::1", hostsFileName,
136                 true);
137         testAddress = InetAddress.getByName("host-ipv6.sample-domain");
138         retrievedIpAddr = testAddress.getAddress();
139         if (!Arrays.equals(retrievedIpAddr, expectedIpAddrIpv6_1)) {
140             System.out.println("retrieved ipv6 addr == " + Arrays.toString(retrievedIpAddr));
141             System.out.println("expected ipv6 addr == " + Arrays.toString(expectedIpAddrIpv6_1));
142             throw new RuntimeException(
143                     "retrieved IPV6 Addr not equal to expected IPV6 Addr");
144         }
145     }
146 
testIpAddressToHostNameMappings(String hostsFileName)147     private static void testIpAddressToHostNameMappings(String hostsFileName)
148             throws Exception {
149         System.out.println(" TEST IP ADDRESS TO HOST MAPPINGS ");
150         InetAddress testAddress;
151         String retrievedHost;
152         String expectedHost = "testHost.testDomain";
153 
154         byte[] testHostIpAddr = { 10, 2, 3, 4 };
155         byte[] testHostIpAddr2 = { 10, 5, 6, 7 };
156         byte[] testHostIpAddr3 = { 10, 8, 9, 10 };
157         byte[] testHostIpAddr4 = { 10, 8, 9, 11 };
158 
159         // add comment to hosts file
160         addMappingToHostsFile("test hosts file for internal NameService ", "#", hostsFileName,
161                 false);
162         addMappingToHostsFile("testHost.testDomain", "10.2.3.4", hostsFileName,
163                 true);
164 
165         testAddress = InetAddress.getByAddress(testHostIpAddr);
166         System.out.println("*******   testAddress == " + testAddress);
167         retrievedHost = testAddress.getHostName();
168         if (!expectedHost.equals(retrievedHost)) {
169             throw new RuntimeException(
170                     "retrieved host name not equal to expected host name");
171         }
172 
173         addMappingToHostsFile("testHost.testDomain", "10.5.6.7", hostsFileName,
174                 true);
175 
176         testAddress = InetAddress.getByAddress(testHostIpAddr2);
177         System.out.println("*******   testAddress == " + testAddress);
178         retrievedHost = testAddress.getHostName();
179         System.out.println("*******   retrievedHost == " + retrievedHost);
180         if (!expectedHost.equals(retrievedHost)) {
181             throw new RuntimeException("retrieved host name " + retrievedHost
182                     + " not equal to expected host name" + expectedHost);
183         }
184 
185         testAddress = InetAddress.getByAddress(testHostIpAddr4);
186         System.out.println("*******   testAddress == " + testAddress);
187         if ("10.8.9.11".equalsIgnoreCase(testAddress.getCanonicalHostName())) {
188             System.out.println("addr = " + addrToString(testHostIpAddr4)
189                     + "  resolve to a host address as expected");
190         } else {
191             System.out.println("addr = " + addrToString(testHostIpAddr4)
192                     + " does not resolve as expected, testAddress == " + testAddress.getCanonicalHostName());
193             throw new RuntimeException("problem with resolving "
194                     + addrToString(testHostIpAddr4));
195         }
196 
197         try {
198             addMappingToHostsFile("", "10.8.9.10", hostsFileName, true);
199             testAddress = InetAddress.getByAddress(testHostIpAddr3);
200             System.out.println("*******   testAddress == " + testAddress);
201             retrievedHost = testAddress.getCanonicalHostName();
202         } catch (Throwable t) {
203             throw new RuntimeException("problem with resolving "
204                     + addrToString(testHostIpAddr3));
205         }
206 
207     }
208 
addrToString(byte addr[])209     private static String addrToString(byte addr[]) {
210         return Byte.toString(addr[0]) + "." + Byte.toString(addr[1]) + "."
211                 + Byte.toString(addr[2]) + "." + Byte.toString(addr[3]);
212     }
213 
addMappingToHostsFile( String host, String addr, String hostsFileName, boolean append)214     private static void addMappingToHostsFile( String host,
215                                                String addr,
216                                                String hostsFileName,
217                                                boolean append)
218                                                throws Exception {
219         String mapping = addr + " " + host;
220         try (PrintWriter hfPWriter = new PrintWriter(new BufferedWriter(
221                 new FileWriter(hostsFileName, append)))) {
222             hfPWriter.println(mapping);
223         }
224     }
225 
226 }
227