| /* |
| * 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.harmony.tests.java.net; |
| |
| import java.net.InetAddress; |
| |
| import tests.support.Support_Configuration; |
| |
| public class InetAddressThreadTest extends junit.framework.TestCase { |
| |
| private static boolean someoneDone[] = new boolean[2]; |
| |
| protected static boolean threadedTestSucceeded; |
| |
| protected static String threadedTestErrorString; |
| |
| /** |
| * This class is used to test inet_ntoa, gethostbyaddr and gethostbyname |
| * functions in the VM to make sure they're threadsafe. getByName will cause |
| * the gethostbyname function to be called. getHostName will cause the |
| * gethostbyaddr to be called. getHostAddress will cause inet_ntoa to be |
| * called. |
| */ |
| static class threadsafeTestThread extends Thread { |
| private String lookupName; |
| |
| private InetAddress testAddress; |
| |
| private int testType; |
| |
| /* |
| * REP_NUM can be adjusted if desired. Since this error is |
| * non-deterministic it may not always occur. Setting REP_NUM higher, |
| * increases the chances of an error being detected, but causes the test |
| * to take longer. Because the Java threads spend a lot of time |
| * performing operations other than running the native code that may not |
| * be threadsafe, it is quite likely that several thousand iterations |
| * will elapse before the first error is detected. |
| */ |
| private static final int REP_NUM = 20000; |
| |
| public threadsafeTestThread(String name, String lookupName, |
| InetAddress testAddress, int type) { |
| super(name); |
| this.lookupName = lookupName; |
| this.testAddress = testAddress; |
| testType = type; |
| } |
| |
| public void run() { |
| try { |
| String correctName = testAddress.getHostName(); |
| String correctAddress = testAddress.getHostAddress(); |
| long startTime = System.currentTimeMillis(); |
| |
| synchronized (someoneDone) { |
| } |
| |
| for (int i = 0; i < REP_NUM; i++) { |
| if (someoneDone[testType]) { |
| break; |
| } else if ((i % 25) == 0 |
| && System.currentTimeMillis() - startTime > 240000) { |
| System.out |
| .println("Exiting due to time limitation after " |
| + i + " iterations"); |
| break; |
| } |
| |
| InetAddress ia = InetAddress.getByName(lookupName); |
| String hostName = ia.getHostName(); |
| String hostAddress = ia.getHostAddress(); |
| |
| // Intentionally not looking for exact name match so that |
| // the test works across different platforms that may or |
| // may not include a domain suffix on the hostname |
| if (!hostName.startsWith(correctName)) { |
| threadedTestSucceeded = false; |
| threadedTestErrorString = (testType == 0 ? "gethostbyname" |
| : "gethostbyaddr") |
| + ": getHostName() returned " |
| + hostName |
| + " instead of " + correctName; |
| break; |
| } |
| // IP addresses should match exactly |
| if (!correctAddress.equals(hostAddress)) { |
| threadedTestSucceeded = false; |
| threadedTestErrorString = (testType == 0 ? "gethostbyname" |
| : "gethostbyaddr") |
| + ": getHostName() returned " |
| + hostAddress |
| + " instead of " + correctAddress; |
| break; |
| } |
| |
| } |
| someoneDone[testType] = true; |
| } catch (Exception e) { |
| threadedTestSucceeded = false; |
| threadedTestErrorString = e.toString(); |
| } |
| } |
| } |
| |
| /** |
| * java.net.InetAddress#getHostName() |
| */ |
| public void test_getHostName() throws Exception { |
| // Test for method java.lang.String java.net.InetAddress.getHostName() |
| |
| // Make sure there is no caching |
| String originalPropertyValue = System |
| .getProperty("networkaddress.cache.ttl"); |
| System.setProperty("networkaddress.cache.ttl", "0"); |
| |
| // Test for threadsafety |
| try { |
| InetAddress lookup1 = InetAddress.getByName("localhost"); |
| assertEquals("127.0.0.1", lookup1.getHostAddress()); |
| InetAddress lookup2 = InetAddress.getByName("localhost"); |
| assertEquals("127.0.0.1", lookup2.getHostAddress()); |
| threadsafeTestThread thread1 = new threadsafeTestThread("1", |
| lookup1.getHostName(), lookup1, 0); |
| threadsafeTestThread thread2 = new threadsafeTestThread("2", |
| lookup2.getHostName(), lookup2, 0); |
| threadsafeTestThread thread3 = new threadsafeTestThread("3", |
| lookup1.getHostAddress(), lookup1, 1); |
| threadsafeTestThread thread4 = new threadsafeTestThread("4", |
| lookup2.getHostAddress(), lookup2, 1); |
| |
| // initialize the flags |
| threadedTestSucceeded = true; |
| synchronized (someoneDone) { |
| thread1.start(); |
| thread2.start(); |
| thread3.start(); |
| thread4.start(); |
| } |
| thread1.join(); |
| thread2.join(); |
| thread3.join(); |
| thread4.join(); |
| /* FIXME: comment the assertion below because it is platform/configuration dependent |
| * Please refer to HARMONY-1664 (https://issues.apache.org/jira/browse/HARMONY-1664) |
| * for details |
| */ |
| // assertTrue(threadedTestErrorString, threadedTestSucceeded); |
| } finally { |
| // restore the old value of the property |
| if (originalPropertyValue == null) |
| // setting the property to -1 has the same effect as having the |
| // property be null |
| System.setProperty("networkaddress.cache.ttl", "-1"); |
| else |
| System.setProperty("networkaddress.cache.ttl", |
| originalPropertyValue); |
| } |
| } |
| } |