/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2011, all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.utils;
import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
/**
* Unit tests for IP address utilities.
*/
public class IpUtilsTest {
@Test
public void testParseAddress() throws UnknownHostException {
List<String> validIps = Arrays.asList("192.168.1.2", "0.0.0.0", "255.255.255.0", "::1",
"fe80::d69a:20ff:febe:2e22", "[::1]", "[fe80::d69a:20ff:febe:2e22]");
for (String ip : validIps) {
InetAddress parsed = IpUtils.parseAddress(ip);
assertEquals(InetAddress.getByName(ip), parsed);
}
List<String> invalidIps = Arrays.asList("192.168.1.256", "192.168.-1.5", "www.zenoss.com", "ge80::");
for (String ip : invalidIps) {
try {
IpUtils.parseAddress(ip);
fail("Expected to fail with IllegalArgumentException");
} catch (IllegalArgumentException e) {
// Expected
}
}
}
@Test
public void testCanonicalIpAddress() throws UnknownHostException {
final Map<String,String> expected = new HashMap<String,String>();
expected.put("000.000.000.000", "0.0.0.0");
expected.put("192.168.001.002", "192.168.1.2");
expected.put("0000:0000:0000:0000:0000:0000:0000:0001", "::1");
expected.put("fe80:0000:0000:0000:0000:0000:0000:0001", "fe80::1");
expected.put("fd00:6587:52d7:0047:d69a:20ff:febe:2e22", "fd00:6587:52d7:47:d69a:20ff:febe:2e22");
for (Map.Entry<String,String> entry : expected.entrySet()) {
assertEquals(entry.getKey(), IpUtils.canonicalIpAddress(InetAddress.getByName(entry.getValue())));
}
}
@Test
public void testPrefixBitsToNetmask() throws UnknownHostException {
final Map<Integer,String> ipv4Expected = new HashMap<Integer,String>();
ipv4Expected.put(24, "255.255.255.0");
ipv4Expected.put(32, "255.255.255.255");
ipv4Expected.put(1, "128.0.0.0");
ipv4Expected.put(0, "0.0.0.0");
for (Map.Entry<Integer,String> entry : ipv4Expected.entrySet()) {
assertEquals(InetAddress.getByName(entry.getValue()), IpUtils.prefixBitsToNetmask(entry.getKey(), false));
}
final Map<Integer,String> ipv6Expected = new HashMap<Integer,String>();
ipv6Expected.put(0, "::");
ipv6Expected.put(64, "ffff:ffff:ffff:ffff::");
ipv6Expected.put(32, "ffff:ffff::");
ipv6Expected.put(128, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
for (Map.Entry<Integer,String> entry : ipv6Expected.entrySet()) {
assertEquals(InetAddress.getByName(entry.getValue()), IpUtils.prefixBitsToNetmask(entry.getKey(), true));
}
final List<Integer> expectedIPv4Failures = Arrays.asList(-1, 33);
for (Integer expectedFailure : expectedIPv4Failures) {
try {
IpUtils.prefixBitsToNetmask(expectedFailure, false);
fail("Expected failure");
} catch (IllegalArgumentException e) {
// Expected
}
}
final List<Integer> expectedIPv6Failures = Arrays.asList(-1, 129);
for (Integer expectedFailure : expectedIPv6Failures) {
try {
IpUtils.prefixBitsToNetmask(expectedFailure, false);
fail("Expected failure");
} catch (IllegalArgumentException e) {
// Expected
}
}
}
@Test
public void testNetmaskToPrefixBits() throws UnknownHostException {
final Map<String,Integer> expected = new HashMap<String,Integer>();
expected.put("255.255.255.255", 32);
expected.put("255.255.255.0", 24);
expected.put("128.0.0.0", 1);
expected.put("0.0.0.0", 0);
expected.put("::", 0);
expected.put("ffff:ffff:ffff:ffff::", 64);
expected.put("ffff:ffff::", 32);
expected.put("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 128);
for (Map.Entry<String,Integer> entry : expected.entrySet()) {
assertEquals(entry.getValue().intValue(), IpUtils.netmaskToPrefixBits(InetAddress.getByName(entry.getKey())));
}
final List<String> expectedFailures = Arrays.asList("255.255.0.1", "ffff::1");
for (String expectedFailure : expectedFailures) {
try {
IpUtils.netmaskToPrefixBits(InetAddress.getByName(expectedFailure));
fail("Expected failure");
} catch (IllegalArgumentException e) {
// Expected
}
}
}
@Test
public void testParseRange() throws UnknownHostException {
final Map<String,IpRange> expected = new HashMap<String,IpRange>();
expected.put("192.168.1.1-15", new IpRange(InetAddress.getByName("192.168.1.1"),
InetAddress.getByName("192.168.1.15")));
expected.put("192.168.1.1/24", new IpRange(InetAddress.getByName("192.168.1.0"),
InetAddress.getByName("192.168.1.255")));
expected.put("192.168.0.100/28", new IpRange(InetAddress.getByName("192.168.0.96"),
InetAddress.getByName("192.168.0.111")));
expected.put("192.168.1.1/255.255.255.0", new IpRange(InetAddress.getByName("192.168.1.0"),
InetAddress.getByName("192.168.1.255")));
expected.put("192.168.1.1-192.168.1.5", new IpRange(InetAddress.getByName("192.168.1.1"),
InetAddress.getByName("192.168.1.5")));
expected.put("192.168.1.1", new IpRange(InetAddress.getByName("192.168.1.1"),
InetAddress.getByName("192.168.1.1")));
expected.put("::1-::feed", new IpRange(InetAddress.getByName("::1"),
InetAddress.getByName("::feed")));
expected.put("::1-ffff", new IpRange(InetAddress.getByName("::1"),
InetAddress.getByName("::ffff")));
expected.put("fe80::d69a:20ff:febe:2e22/64", new IpRange(InetAddress.getByName("fe80::"),
InetAddress.getByName("fe80::ffff:ffff:ffff:ffff")));
for (Map.Entry<String,IpRange> entry : expected.entrySet()) {
assertEquals(entry.getValue(), IpUtils.parseRange(entry.getKey()));
}
List<String> expectedFailures = Arrays.asList("192.168.1.2-192.168.1.1", "::2-::1", "192.168.1.2-fe80::");
for (String expectedFailure : expectedFailures) {
try {
IpUtils.parseRange(expectedFailure);
fail("Expected to fail: " + expectedFailure);
} catch (IllegalArgumentException e) {
// Expected
}
}
}
@Test
public void testIpRange() throws UnknownHostException {
IpRange range = new IpRange(InetAddress.getByName("192.168.1.99"), InetAddress.getByName("192.168.1.150"));
assertTrue(range.contains(InetAddress.getByName("192.168.1.99")));
assertTrue(range.contains(InetAddress.getByName("192.168.1.120")));
assertTrue(range.contains(InetAddress.getByName("192.168.1.150")));
assertFalse(range.contains(InetAddress.getByName("192.168.1.98")));
assertFalse(range.contains(InetAddress.getByName("192.168.1.151")));
range = new IpRange(InetAddress.getByName("fe80::1"), InetAddress.getByName("fe80::7"));
assertTrue(range.contains(InetAddress.getByName("fe80::1")));
assertTrue(range.contains(InetAddress.getByName("fe80::6")));
assertTrue(range.contains(InetAddress.getByName("fe80::7")));
assertFalse(range.contains(InetAddress.getByName("fe80::")));
assertFalse(range.contains(InetAddress.getByName("fe80::8")));
}
}