/* * 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 tests.api.java.net; import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestTargets; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetNew; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.security.Permission; import java.util.ArrayList; import java.util.Enumeration; @TestTargetClass(NetworkInterface.class) public class NetworkInterfaceTest extends junit.framework.TestCase { // private member variables used for tests boolean atLeastOneInterface = false; boolean atLeastTwoInterfaces = false; private NetworkInterface networkInterface1 = null; private NetworkInterface sameAsNetworkInterface1 = null; private NetworkInterface networkInterface2 = null; /** * @tests java.net.NetworkInterface#getName() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getName", args = {} ) public void test_getName() { if (atLeastOneInterface) { assertNotNull("validate that non null name is returned", networkInterface1.getName()); assertFalse("validate that non-zero length name is generated", networkInterface1.getName().equals("")); } if (atLeastTwoInterfaces) { assertFalse( "Validate strings are different for different interfaces", networkInterface1.getName().equals( networkInterface2.getName())); } } /** * @tests java.net.NetworkInterface#getInetAddresses() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getInetAddresses", args = {} ) public void test_getInetAddresses() { // security manager that allows us to check that we only return the // addresses that we should class mySecurityManager extends SecurityManager { ArrayList disallowedNames = null; public mySecurityManager(ArrayList addresses) { disallowedNames = new ArrayList(); for (int i = 0; i < addresses.size(); i++) { disallowedNames.add(((InetAddress) addresses.get(i)) .getHostName()); disallowedNames.add(((InetAddress) addresses.get(i)) .getHostAddress()); } } public void checkConnect(String host, int port) { if (host == null) { throw new NullPointerException("host was null)"); } for (int i = 0; i < disallowedNames.size(); i++) { if (((String) disallowedNames.get(i)).equals(host)) { throw new SecurityException("not allowed"); } } } public void checkPermission(Permission perm) { // allow everything } } if (atLeastOneInterface) { Enumeration theAddresses = networkInterface1.getInetAddresses(); if (theAddresses != null) { while (theAddresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) theAddresses .nextElement(); assertTrue("validate that address is not null", null != theAddress); } } } if (atLeastTwoInterfaces) { Enumeration theAddresses = networkInterface2.getInetAddresses(); if (theAddresses != null) { while (theAddresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) theAddresses .nextElement(); assertTrue("validate that address is not null", null != theAddress); } } } // create the list of ok and not ok addresses to return if (atLeastOneInterface) { ArrayList okAddresses = new ArrayList(); Enumeration addresses = networkInterface1.getInetAddresses(); int index = 0; ArrayList notOkAddresses = new ArrayList(); if (addresses != null) { while (addresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) addresses .nextElement(); if (index != 0) { okAddresses.add(theAddress); } else { notOkAddresses.add(theAddress); } index++; } } // do the same for network interface 2 it it exists if (atLeastTwoInterfaces) { addresses = networkInterface2.getInetAddresses(); index = 0; if (addresses != null) { while (addresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) addresses .nextElement(); if (index != 0) { okAddresses.add(theAddress); } else { notOkAddresses.add(theAddress); } index++; } } } // set the security manager that will make the first address not // visible System.setSecurityManager(new mySecurityManager(notOkAddresses)); // validate not ok addresses are not returned for (int i = 0; i < notOkAddresses.size(); i++) { Enumeration reducedAddresses = networkInterface1 .getInetAddresses(); if (reducedAddresses != null) { while (reducedAddresses.hasMoreElements()) { InetAddress nextAddress = (InetAddress) reducedAddresses .nextElement(); assertTrue( "validate that address without permission is not returned", !nextAddress.equals(notOkAddresses.get(i))); } } if (atLeastTwoInterfaces) { reducedAddresses = networkInterface2.getInetAddresses(); if (reducedAddresses != null) { while (reducedAddresses.hasMoreElements()) { InetAddress nextAddress = (InetAddress) reducedAddresses .nextElement(); assertTrue( "validate that address without permission is not returned", !nextAddress.equals(notOkAddresses.get(i))); } } } } // validate that ok addresses are returned for (int i = 0; i < okAddresses.size(); i++) { boolean addressReturned = false; Enumeration reducedAddresses = networkInterface1 .getInetAddresses(); if (reducedAddresses != null) { while (reducedAddresses.hasMoreElements()) { InetAddress nextAddress = (InetAddress) reducedAddresses .nextElement(); if (nextAddress.equals(okAddresses.get(i))) { addressReturned = true; } } } if (atLeastTwoInterfaces) { reducedAddresses = networkInterface2.getInetAddresses(); if (reducedAddresses != null) { while (reducedAddresses.hasMoreElements()) { InetAddress nextAddress = (InetAddress) reducedAddresses .nextElement(); if (nextAddress.equals(okAddresses.get(i))) { addressReturned = true; } } } } assertTrue("validate that address with permission is returned", addressReturned); } // validate that we can get the interface by specifying the address. // This is to be compatible for (int i = 0; i < notOkAddresses.size(); i++) { try { assertNotNull( "validate we cannot get the NetworkInterface with an address for which we have no privs", NetworkInterface .getByInetAddress((InetAddress) notOkAddresses .get(i))); } catch (Exception e) { fail("get NetworkInterface for address with no perm - exception"); } } // validate that we can get the network interface for the good // addresses try { for (int i = 0; i < okAddresses.size(); i++) { assertNotNull( "validate we cannot get the NetworkInterface with an address fro which we have no privs", NetworkInterface .getByInetAddress((InetAddress) okAddresses .get(i))); } } catch (Exception e) { fail("get NetworkInterface for address with perm - exception"); } System.setSecurityManager(null); } } /** * @tests java.net.NetworkInterface#getDisplayName() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "getDisplayName", args = {} ) public void test_getDisplayName() { if (atLeastOneInterface) { assertNotNull("validate that non null display name is returned", networkInterface1.getDisplayName()); assertFalse( "validate that non-zero lengtj display name is generated", networkInterface1.getDisplayName().equals("")); } if (atLeastTwoInterfaces) { assertFalse( "Validate strings are different for different interfaces", networkInterface1.getDisplayName().equals( networkInterface2.getDisplayName())); } } /** * @tests java.net.NetworkInterface#getByName(java.lang.String) */ @TestTargetNew( level = TestLevel.SUFFICIENT, notes = "SocketException checking missed.", method = "getByName", args = {java.lang.String.class} ) public void test_getByNameLjava_lang_String() { try { assertNull("validate null handled ok", NetworkInterface.getByName(null)); fail("getByName did not throw NullPointerException for null argument"); } catch (NullPointerException e) { } catch (Exception e) { fail("getByName, null inetAddress - raised exception : " + e.getMessage()); } try { assertNull("validate handled ok if we ask for name not associated with any interface", NetworkInterface.getByName("8not a name4")); } catch (Exception e) { fail("getByName, unknown inetAddress - raised exception : " + e.getMessage()); } // for each address in an interface validate that we get the right // interface for that name if (atLeastOneInterface) { String theName = networkInterface1.getName(); if (theName != null) { try { assertTrue( "validate that Interface can be obtained with its name", NetworkInterface.getByName(theName).equals( networkInterface1)); } catch (Exception e) { fail("validate to get network interface using name - socket exception"); } } try { NetworkInterface.getByName(null); fail("NullPointerException was not thrown."); } catch(NullPointerException npe) { //expected } catch (SocketException e) { fail("SocketException was thrown."); } } // validate that we get the right interface with the second interface as // well (ie we just don't always get the first interface if (atLeastTwoInterfaces) { String theName = networkInterface2.getName(); if (theName != null) { try { assertTrue( "validate that Interface can be obtained with its name", NetworkInterface.getByName(theName).equals( networkInterface2)); } catch (Exception e) { fail("validate to get network interface using name - socket exception"); } } } } /** * @tests java.net.NetworkInterface#getByInetAddress(java.net.InetAddress) */ @TestTargetNew( level = TestLevel.SUFFICIENT, notes = "SocketException checking missed.", method = "getByInetAddress", args = {java.net.InetAddress.class} ) public void test_getByInetAddressLjava_net_InetAddress() { byte addressBytes[] = new byte[4]; addressBytes[0] = 0; addressBytes[1] = 0; addressBytes[2] = 0; addressBytes[3] = 0; try { assertNull("validate null handled ok", NetworkInterface.getByInetAddress(null)); fail("should not get here if getByInetAddress throws " + "NullPointerException if null passed in"); } catch (NullPointerException e) { } catch (Exception e) { fail("getByInetAddress, null inetAddress should have raised NPE" + " but instead threw a : " + e.getMessage()); } try { assertNull("validate handled ok if we ask for address not associated with any interface", NetworkInterface.getByInetAddress(InetAddress .getByAddress(addressBytes))); } catch (Exception e) { fail("getByInetAddress, unknown inetAddress threw exception : " + e); } // for each address in an interface validate that we get the right // interface for that address if (atLeastOneInterface) { Enumeration addresses = networkInterface1.getInetAddresses(); if (addresses != null) { while (addresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) addresses .nextElement(); try { assertTrue( "validate that Interface can be obtained with any one of its addresses", NetworkInterface.getByInetAddress(theAddress) .equals(networkInterface1)); } catch (Exception e) { fail("validate to get address using inetAddress " + "threw exception : " + e); } } } try { NetworkInterface.getByInetAddress(null); fail("NullPointerException should be thrown."); } catch(NullPointerException npe) { //expected } catch (SocketException e) { fail("SocketException was thrown."); } } // validate that we get the right interface with the second interface as // well (ie we just don't always get the first interface if (atLeastTwoInterfaces) { Enumeration addresses = networkInterface2.getInetAddresses(); if (addresses != null) { while (addresses.hasMoreElements()) { InetAddress theAddress = (InetAddress) addresses .nextElement(); try { assertTrue( "validate that Interface can be obtained with any one of its addresses", NetworkInterface.getByInetAddress(theAddress) .equals(networkInterface2)); } catch (Exception e) { fail("validate to get address using inetAddress " + "threw exception : " + e); } } } } } /** * @tests java.net.NetworkInterface#getNetworkInterfaces() */ @TestTargetNew( level = TestLevel.SUFFICIENT, notes = "SocketException checking missed.", method = "getNetworkInterfaces", args = {} ) public void test_getNetworkInterfaces() { // really this is tested by all of the other calls but just make sure we // can call it and get a list of interfaces if they exist try { Enumeration theInterfaces = NetworkInterface.getNetworkInterfaces(); } catch (Exception e) { fail("get Network Interfaces - raised exception : " + e.getMessage()); } } /** * @tests java.net.NetworkInterface#equals(java.lang.Object) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "equals", args = {java.lang.Object.class} ) public void test_equalsLjava_lang_Object() { // Test for method boolean // java.net.SocketPermission.equals(java.lang.Object) if (atLeastOneInterface) { assertTrue("If objects are the same true is returned", networkInterface1.equals(sameAsNetworkInterface1)); assertFalse("Validate Null handled ok", networkInterface1 .equals(null)); } if (atLeastTwoInterfaces) { assertFalse("If objects are different false is returned", networkInterface1.equals(networkInterface2)); } } /** * @tests java.net.NetworkInterface#hashCode() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "hashCode", args = {} ) public void test_hashCode() { if (atLeastOneInterface) { assertTrue( "validate that hash codes are the same for two calls on the same object", networkInterface1.hashCode() == networkInterface1 .hashCode()); assertTrue( "validate that hash codes are the same for two objects for which equals is true", networkInterface1.hashCode() == sameAsNetworkInterface1 .hashCode()); } } /** * @tests java.net.NetworkInterface#toString() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "toString", args = {} ) public void test_toString() { if (atLeastOneInterface) { assertNotNull("validate that non null string is generated", networkInterface1.toString()); assertFalse("validate that non-zero length string is generated", networkInterface1.toString().equals("")); } if (atLeastTwoInterfaces) { assertFalse( "Validate strings are different for different interfaces", networkInterface1.toString().equals( networkInterface2.toString())); } } protected void setUp() { Enumeration theInterfaces = null; try { theInterfaces = NetworkInterface.getNetworkInterfaces(); } catch (Exception e) { fail("Exception occurred getting network interfaces : " + e); } // Set up NetworkInterface instance members. Note that because the call // to NetworkInterface.getNetworkInterfaces() returns *all* of the // interfaces on the test machine it is possible that one or more of // them will not currently be bound to an InetAddress. e.g. a laptop // running connected by a wire to the local network may also have a // wireless interface that is not active and so has no InetAddress // bound to it. For these tests only work with NetworkInterface objects // that are bound to an InetAddress. if ((theInterfaces != null) && (theInterfaces.hasMoreElements())) { while ((theInterfaces.hasMoreElements()) && (atLeastOneInterface == false)) { NetworkInterface theInterface = (NetworkInterface) theInterfaces .nextElement(); if (theInterface.getInetAddresses() != null) { // Ensure that the current NetworkInterface has at least // one InetAddress bound to it. Enumeration addrs = theInterface.getInetAddresses(); if ((addrs != null) && (addrs.hasMoreElements())) { atLeastOneInterface = true; networkInterface1 = theInterface; }// end if } } while ((theInterfaces.hasMoreElements()) && (atLeastTwoInterfaces == false)) { NetworkInterface theInterface = (NetworkInterface) theInterfaces .nextElement(); if (theInterface.getInetAddresses() != null) { // Ensure that the current NetworkInterface has at least // one InetAddress bound to it. Enumeration addrs = theInterface.getInetAddresses(); if ((addrs != null) && (addrs.hasMoreElements())) { atLeastTwoInterfaces = true; networkInterface2 = theInterface; }// end if } } // Only set sameAsNetworkInterface1 if we succeeded in finding // at least one good NetworkInterface if (atLeastOneInterface) { Enumeration addresses = networkInterface1.getInetAddresses(); if (addresses != null) { try { if (addresses.hasMoreElements()) { sameAsNetworkInterface1 = NetworkInterface .getByInetAddress((InetAddress) addresses .nextElement()); } } catch (SocketException e) { fail("SocketException occurred : " + e); } } }// end if atLeastOneInterface } } protected void tearDown() { System.setSecurityManager(null); } }