blob: 36ea46436a9327573221a6996187984b4a4b51e5 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed 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 libcore.java.net;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Collections;
import tests.util.SerializationTester;
public class InetAddressTest extends junit.framework.TestCase {
private static final byte[] LOOPBACK6_BYTES = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
private static final String[] INVALID_IPv4_NUMERIC_ADDRESSES = new String[] {
// IPv4 addresses may not be surrounded by square brackets.
"[127.0.0.1]",
// Trailing dots are not allowed.
"1.2.3.4.",
// Nor is any kind of trailing junk.
"1.2.3.4hello",
// Out of range.
"256.2.3.4",
"1.256.3.4",
"1.2.256.4",
"1.2.3.256",
// Deprecated.
"1.2.3",
"1.2",
"1",
"1234",
"0", // Single out the deprecated form of the ANY address.
// Hex.
"0x1.0x2.0x3.0x4",
"0x7f.0x00.0x00.0x01",
"7f.0.0.1",
// Octal.
"0177.00.00.01", // Historically, this would have been interpreted as 127.0.0.1.
// Negative numbers.
"-1.0.0.1",
"1.-1.0.1",
"1.0.-1.1",
"1.0.0.-1",
};
private static Inet6Address loopback6() throws Exception {
return (Inet6Address) InetAddress.getByAddress(LOOPBACK6_BYTES);
}
private static Inet6Address localhost6() throws Exception {
return (Inet6Address) InetAddress.getByAddress("localhost", LOOPBACK6_BYTES);
}
public void test_parseNumericAddress() throws Exception {
// Regular IPv4.
assertEquals("/1.2.3.4", InetAddress.parseNumericAddress("1.2.3.4").toString());
// Regular IPv6.
assertEquals("/2001:4860:800d::68", InetAddress.parseNumericAddress("2001:4860:800d::68").toString());
// Optional square brackets around IPv6 addresses, including mapped IPv4.
assertEquals("/2001:4860:800d::68", InetAddress.parseNumericAddress("[2001:4860:800d::68]").toString());
assertEquals("/127.0.0.1", InetAddress.parseNumericAddress("[::ffff:127.0.0.1]").toString());
try {
InetAddress.parseNumericAddress("example.com"); // Not numeric.
fail();
} catch (IllegalArgumentException expected) {
}
for (String invalid : INVALID_IPv4_NUMERIC_ADDRESSES) {
try {
InetAddress.parseNumericAddress(invalid);
fail(invalid);
} catch (IllegalArgumentException expected) {
}
}
// Strange special cases, for compatibility with InetAddress.getByName.
assertTrue(InetAddress.parseNumericAddress(null).isLoopbackAddress());
assertTrue(InetAddress.parseNumericAddress("").isLoopbackAddress());
}
public void test_isNumeric() throws Exception {
assertTrue(InetAddress.isNumeric("1.2.3.4"));
assertTrue(InetAddress.isNumeric("127.0.0.1"));
assertFalse(InetAddress.isNumeric("example.com"));
for (String invalid : INVALID_IPv4_NUMERIC_ADDRESSES) {
assertFalse(invalid, InetAddress.isNumeric(invalid));
}
}
public void test_isLinkLocalAddress() throws Exception {
assertFalse(InetAddress.getByName("127.0.0.1").isLinkLocalAddress());
assertTrue(InetAddress.getByName("169.254.1.2").isLinkLocalAddress());
assertFalse(InetAddress.getByName("fec0::").isLinkLocalAddress());
assertTrue(InetAddress.getByName("fe80::").isLinkLocalAddress());
}
public void test_isMCSiteLocalAddress() throws Exception {
assertFalse(InetAddress.getByName("239.254.255.255").isMCSiteLocal());
assertTrue(InetAddress.getByName("239.255.0.0").isMCSiteLocal());
assertTrue(InetAddress.getByName("239.255.255.255").isMCSiteLocal());
assertFalse(InetAddress.getByName("240.0.0.0").isMCSiteLocal());
assertFalse(InetAddress.getByName("ff06::").isMCSiteLocal());
assertTrue(InetAddress.getByName("ff05::").isMCSiteLocal());
assertTrue(InetAddress.getByName("ff15::").isMCSiteLocal());
}
public void test_isReachable() throws Exception {
// http://code.google.com/p/android/issues/detail?id=20203
InetAddress addr = SerializationTester.getDeserializedObject(InetAddress.getByName("www.google.com"));
addr.isReachable(500);
for (NetworkInterface nif : Collections.list(NetworkInterface.getNetworkInterfaces())) {
addr.isReachable(nif, 20, 500);
}
}
public void test_isSiteLocalAddress() throws Exception {
assertFalse(InetAddress.getByName("144.32.32.1").isSiteLocalAddress());
assertTrue(InetAddress.getByName("10.0.0.1").isSiteLocalAddress());
assertTrue(InetAddress.getByName("172.16.0.1").isSiteLocalAddress());
assertFalse(InetAddress.getByName("172.32.0.1").isSiteLocalAddress());
assertTrue(InetAddress.getByName("192.168.0.1").isSiteLocalAddress());
assertFalse(InetAddress.getByName("fc00::").isSiteLocalAddress());
assertTrue(InetAddress.getByName("fec0::").isSiteLocalAddress());
}
public void test_getByName() throws Exception {
for (String invalid : INVALID_IPv4_NUMERIC_ADDRESSES) {
try {
InetAddress.getByName(invalid);
fail(invalid);
} catch (UnknownHostException expected) {
}
}
}
public void test_getLoopbackAddress() throws Exception {
assertTrue(InetAddress.getLoopbackAddress().isLoopbackAddress());
}
public void test_equals() throws Exception {
InetAddress addr = InetAddress.getByName("239.191.255.255");
assertTrue(addr.equals(addr));
assertTrue(loopback6().equals(localhost6()));
assertFalse(addr.equals(loopback6()));
assertTrue(Inet4Address.LOOPBACK.equals(Inet4Address.LOOPBACK));
// http://b/4328294 - the scope id isn't included when comparing Inet6Address instances.
byte[] bs = new byte[16];
assertEquals(Inet6Address.getByAddress("1", bs, 1), Inet6Address.getByAddress("2", bs, 2));
}
public void test_getHostAddress() throws Exception {
assertEquals("::1", localhost6().getHostAddress());
assertEquals("::1", InetAddress.getByName("::1").getHostAddress());
assertEquals("127.0.0.1", Inet4Address.LOOPBACK.getHostAddress());
InetAddress aAddr = InetAddress.getByName("224.0.0.0");
assertEquals("224.0.0.0", aAddr.getHostAddress());
try {
InetAddress.getByName("1");
fail();
} catch (UnknownHostException expected) {
}
byte[] bAddr = {
(byte) 0xFE, (byte) 0x80, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x02, (byte) 0x11, (byte) 0x25, (byte) 0xFF,
(byte) 0xFE, (byte) 0xF8, (byte) 0x7C, (byte) 0xB2
};
aAddr = Inet6Address.getByAddress(bAddr);
String aString = aAddr.getHostAddress();
assertTrue(aString.equals("fe80:0:0:0:211:25ff:fef8:7cb2") || aString.equals("fe80::211:25ff:fef8:7cb2"));
byte[] cAddr = {
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
};
aAddr = Inet6Address.getByAddress(cAddr);
assertEquals("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", aAddr.getHostAddress());
byte[] dAddr = {
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
};
aAddr = Inet6Address.getByAddress(dAddr);
aString = aAddr.getHostAddress();
assertTrue(aString.equals("0:0:0:0:0:0:0:0") || aString.equals("::"));
byte[] eAddr = {
(byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03,
(byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,
(byte) 0x08, (byte) 0x09, (byte) 0x0a, (byte) 0x0b,
(byte) 0x0c, (byte) 0x0d, (byte) 0x0e, (byte) 0x0f
};
aAddr = Inet6Address.getByAddress(eAddr);
assertEquals("1:203:405:607:809:a0b:c0d:e0f", aAddr.getHostAddress());
byte[] fAddr = {
(byte) 0x00, (byte) 0x10, (byte) 0x20, (byte) 0x30,
(byte) 0x40, (byte) 0x50, (byte) 0x60, (byte) 0x70,
(byte) 0x80, (byte) 0x90, (byte) 0xa0, (byte) 0xb0,
(byte) 0xc0, (byte) 0xd0, (byte) 0xe0, (byte) 0xf0
};
aAddr = Inet6Address.getByAddress(fAddr);
assertEquals("10:2030:4050:6070:8090:a0b0:c0d0:e0f0", aAddr.getHostAddress());
}
public void test_hashCode() throws Exception {
InetAddress addr1 = InetAddress.getByName("1.0.0.1");
InetAddress addr2 = InetAddress.getByName("1.0.0.1");
assertTrue(addr1.hashCode() == addr2.hashCode());
assertTrue(loopback6().hashCode() == localhost6().hashCode());
}
public void test_toString() throws Exception {
String validIPAddresses[] = {
"::1.2.3.4", "::", "::", "1::0", "1::", "::1",
"FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF",
"FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:255.255.255.255",
"0:0:0:0:0:0:0:0", "0:0:0:0:0:0:0.0.0.0"
};
String [] resultStrings = {
"/::1.2.3.4", "/::", "/::", "/1::", "/1::", "/::1",
"/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "/::",
"/::"
};
for(int i = 0; i < validIPAddresses.length; i++) {
InetAddress ia = InetAddress.getByName(validIPAddresses[i]);
String result = ia.toString();
assertNotNull(result);
assertEquals(resultStrings[i], result);
}
}
}