/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2007-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.model.discovery;
import java.math.BigInteger;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
import org.opennms.core.utils.ByteArrayComparator;
import org.opennms.core.utils.InetAddressUtils;
/**
* IPAddressRangeTest
*
* @author brozow
*/
public class IPAddressRangeTest extends TestCase {
private final IPAddress zero = new IPAddress("0.0.0.0");
private final IPAddress one = new IPAddress("0.0.0.1");
private final IPAddress maxOneOctet = new IPAddress("0.0.0.255");
private final IPAddress maxTwoOctet = new IPAddress("0.0.255.0");
private final IPAddress maxThreeOctet = new IPAddress("0.255.0.0");
private final IPAddress thirtyBitNumber = new IPAddress("63.255.255.255");
private final IPAddress thirtyOneBitNumber = new IPAddress("127.255.255.255");
private final IPAddress thirtyTwoBit = new IPAddress("128.0.0.0");
private final IPAddress maxFourOctet = new IPAddress("255.0.0.0");
private final IPAddress maxIPv4 = new IPAddress("255.255.255.255");
private final IPAddress maxIPv6 = new IPAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
private final IPAddress maxIPv6MinusFive = new IPAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffa");
private final IPAddress begin = new IPAddress("192.168.1.1");
private final IPAddress addr2 = new IPAddress("192.168.1.3");
private final IPAddress addr3 = new IPAddress("192.168.1.5");
private final IPAddress end = new IPAddress("192.168.1.254");
private final IPAddressRange normal;
private final IPAddressRange singleton;
private final IPAddressRange small;
private final IPAddressRange highV6;
public IPAddressRangeTest() {
normal = new IPAddressRange(begin, end);
small = new IPAddressRange(addr2, addr3);
singleton = new IPAddressRange(addr2, addr2);
highV6 = new IPAddressRange(maxIPv6MinusFive, maxIPv6);
}
public void testToBigInteger() {
IPAddress startAtZero = new IPAddress("0.0.0.0");
assertTrue(startAtZero.isPredecessorOf(one));
assertEquals(0L, startAtZero.toBigInteger().longValue());
startAtZero = startAtZero.incr();
startAtZero = startAtZero.incr();
startAtZero = startAtZero.incr();
startAtZero = startAtZero.incr();
assertEquals(4L, startAtZero.toBigInteger().longValue());
startAtZero = startAtZero.decr();
startAtZero = startAtZero.decr();
assertEquals(2L, startAtZero.toBigInteger().longValue());
assertTrue(startAtZero.isSuccessorOf(one));
assertEquals(1L, one.toBigInteger().longValue());
assertEquals((long)(Math.pow(2, 30) - 1.0), thirtyBitNumber.toBigInteger().longValue());
assertEquals((long)(Math.pow(2, 31) - 1.0), thirtyOneBitNumber.toBigInteger().longValue());
assertEquals((long)(Math.pow(2, 31)), thirtyTwoBit.toBigInteger().longValue());
assertEquals((long)(Math.pow(2, 32) - 1.0), maxIPv4.toBigInteger().longValue());
// assertEquals((long)(Math.pow(2, 16 * 8) - 1.0), maxIPv6.toBigInteger().longValue());
}
public void testConvertBigIntegerIntoInetAddress() throws UnknownHostException {
assertEquals(0, new ByteArrayComparator().compare(zero.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(zero.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(one.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(zero.incr().toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(zero.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(one.decr().toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(one.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(one.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(one.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(one.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(maxOneOctet.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(maxOneOctet.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(maxTwoOctet.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(maxTwoOctet.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(maxThreeOctet.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(maxThreeOctet.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(thirtyBitNumber.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(thirtyBitNumber.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(thirtyOneBitNumber.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(thirtyOneBitNumber.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(thirtyTwoBit.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(thirtyTwoBit.toBigInteger()).getAddress()));
assertEquals(0, new ByteArrayComparator().compare(maxFourOctet.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(maxFourOctet.toBigInteger()).getAddress()));
InetAddress maxIPv4Addr = InetAddressUtils.convertBigIntegerIntoInetAddress(maxIPv4.toBigInteger());
assertTrue(maxIPv4Addr instanceof Inet4Address);
assertFalse(maxIPv4Addr instanceof Inet6Address);
assertEquals(0, new ByteArrayComparator().compare(maxIPv4.toOctets(), maxIPv4Addr.getAddress()));
InetAddress maxIPv6Addr = InetAddressUtils.convertBigIntegerIntoInetAddress(maxIPv6.toBigInteger());
assertTrue(maxIPv6Addr instanceof Inet6Address);
assertFalse(maxIPv6Addr instanceof Inet4Address);
assertEquals(0, new ByteArrayComparator().compare(maxIPv6.toOctets(), maxIPv6Addr.getAddress()));
assertEquals(0, new ByteArrayComparator().compare(maxIPv6MinusFive.toOctets(), InetAddressUtils.convertBigIntegerIntoInetAddress(maxIPv6MinusFive.toBigInteger()).getAddress()));
try {
InetAddressUtils.convertBigIntegerIntoInetAddress(new BigInteger("-1"));
fail("Failed to catch exception for negative value.");
} catch (IllegalArgumentException e) {
// Expected case
}
try {
InetAddressUtils.convertBigIntegerIntoInetAddress(maxIPv6.incr().toBigInteger());
fail("Failed to catch exception for overflow value.");
} catch (IllegalStateException e) {
// Expected case
}
}
public void testToIpAddrString() throws UnknownHostException {
assertEquals("0.0.0.0", InetAddressUtils.toIpAddrString(zero.toOctets()));
assertEquals("0.0.0.1", InetAddressUtils.toIpAddrString(one.toOctets()));
assertEquals("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", InetAddressUtils.toIpAddrString(maxIPv6.toOctets()));
assertEquals("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffa", InetAddressUtils.toIpAddrString(maxIPv6MinusFive.toOctets()));
assertEquals("0000:0000:0000:0000:0000:0000:0000:0001", InetAddressUtils.toIpAddrString(new IPAddress("::1").toOctets()));
assertEquals("aaaa:0000:0000:0000:0000:0000:0000:0001", InetAddressUtils.toIpAddrString(new IPAddress("AAAA::1").toOctets()));
assertEquals("aaaa:0000:0000:0000:0000:0000:0000:0000", InetAddressUtils.toIpAddrString(new IPAddress("AAAA::").toOctets()));
assertEquals("00aa:0000:0000:0000:0000:0000:0000:0000", InetAddressUtils.toIpAddrString(new IPAddress("AA::").toOctets()));
assertEquals("aaaa:0000:0000:0000:0000:0000:0000:0000%15", InetAddressUtils.toIpAddrString(InetAddressUtils.addr("AAAA::%15")));
assertEquals("aaaa:0000:0000:0000:0000:0000:0000:0000", InetAddressUtils.toIpAddrString(InetAddressUtils.addr("AAAA::%0")));
}
public void testCreate() {
assertEquals(begin, normal.getBegin());
assertEquals(end, normal.getEnd());
assertEquals(new BigInteger("254"), normal.size());
assertEquals(maxIPv6MinusFive, highV6.getBegin());
assertEquals(maxIPv6, highV6.getEnd());
assertEquals(new BigInteger("6"), highV6.size());
}
public void testSingletonRange() {
assertEquals(BigInteger.ONE, singleton.size());
}
public void testContains() {
assertTrue(normal.contains(begin));
assertTrue(normal.contains(begin.incr()));
assertTrue(normal.contains(end.decr()));
assertTrue(normal.contains(end));
}
public void testIterator() {
assertEquals(new BigInteger("3"), small.size());
Iterator<IPAddress> it = small.iterator();
assertTrue(it.hasNext());
assertEquals(addr2, it.next());
assertTrue(it.hasNext());
assertEquals(addr2.incr(), it.next());
assertTrue(it.hasNext());
assertEquals(addr3, it.next());
assertFalse(it.hasNext());
}
public void testIterateSingleton() {
Iterator<IPAddress> it = singleton.iterator();
assertTrue(it.hasNext());
assertEquals(addr2, it.next());
assertFalse(it.hasNext());
}
public void testGetLowestInetAddress() throws UnknownHostException {
assertNull(InetAddressUtils.getLowestInetAddress(Collections.<InetAddress>emptyList()));
List<InetAddress> ips;
ips = Arrays.asList(
InetAddressUtils.addr("0.0.0.0")
);
assertEquals("0.0.0.0", getLowestHostAddress(ips));
ips = Arrays.asList(
InetAddressUtils.addr("0.0.0.0"),
InetAddressUtils.addr("abcd:ef00:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("127.0.0.1")
);
assertEquals("0.0.0.0", getLowestHostAddress(ips));
ips = Arrays.asList(
InetAddressUtils.addr("255.255.255.255"),
InetAddressUtils.addr("abcd:ef00:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("127.0.0.1")
);
assertEquals("127.0.0.1", getLowestHostAddress(ips));
ips = Arrays.asList(
InetAddressUtils.addr("8000:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("8000:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001")
);
assertEquals("8000:0000:0000:0000:0000:0000:0000:0001", InetAddressUtils.toIpAddrString(InetAddressUtils.getLowestInetAddress(ips)));
ips = Arrays.asList(
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("8000:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("8000:0000:0000:0000:0000:0000:0000:0001")
);
assertEquals("8000:0000:0000:0000:0000:0000:0000:0001", InetAddressUtils.toIpAddrString(InetAddressUtils.getLowestInetAddress(ips)));
// TODO: These tests produce strange results because it is unclear how this function should
// compare IPv6 addresses that include scope IDs
ips = Arrays.asList(
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001%5"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001")
);
assertEquals("ff00:0000:0000:0000:0000:0000:0000:0001%5", InetAddressUtils.toIpAddrString(InetAddressUtils.getLowestInetAddress(ips)));
ips = Arrays.asList(
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001%5")
);
assertEquals("ff00:0000:0000:0000:0000:0000:0000:0001", InetAddressUtils.toIpAddrString(InetAddressUtils.getLowestInetAddress(ips)));
ips = Arrays.asList(
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001%6"),
InetAddressUtils.addr("ff00:0000:0000:0000:0000:0000:0000:0001%5")
);
assertEquals("ff00:0000:0000:0000:0000:0000:0000:0001%6", InetAddressUtils.toIpAddrString(InetAddressUtils.getLowestInetAddress(ips)));
}
private String getLowestHostAddress(final List<InetAddress> ips) {
return InetAddressUtils.str(InetAddressUtils.getLowestInetAddress(ips));
}
}