92917: Support implicit ranges & update unit tests

This commit is contained in:
Yura Bondarenko
2022-07-11 14:48:24 +02:00
parent 36748cd27d
commit 01d5bf4f4a
2 changed files with 86 additions and 32 deletions

View File

@@ -13,6 +13,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -98,7 +99,17 @@ public class IPTable {
throw new IPFormatException(ip + " - Range format should be similar to 1.2.3.0-1.2.3.255");
}
} else if (ip.contains("/")) {
} else {
// Convert implicit ranges to netmask format
// 192 -> 192.0.0.0/8
// 192.168 -> 192.168.0.0/16
// 192.168.1 -> 192.168.1.0/24
int periods = StringUtils.countMatches(ip, '.');
if (periods < 3) {
ip = StringUtils.join(ip, StringUtils.repeat(".0", 4 - periods - 1), "/", (periods + 1) * 8);
}
if (ip.contains("/")) {
String[] parts = ip.split("/");
try {
byte[] octets = InetAddress.getByName(parts[0]).getAddress();
@@ -115,7 +126,6 @@ public class IPTable {
} catch (Exception e) {
throw new IPFormatException(ip + " - Range format should be similar to 172.16.0.0/12");
}
} else {
try {
long ipLo = ipToLong(InetAddress.getByName(ip));
@@ -126,6 +136,7 @@ public class IPTable {
}
}
}
}
/**
* Convert an IP address to a long integer

View File

@@ -56,14 +56,15 @@ public class IPTableTest {
IPTable instance = new IPTable();
// Add IP address
instance.add(LOCALHOST);
// Add IP range
// Add IP range (contains 256 addresses)
instance.add("192.168.1");
// Make sure both exist
// Make sure it returns the addresses for all ranges
Set<String> ipSet = instance.toSet();
assertEquals(2, ipSet.size());
assertEquals(257, ipSet.size());
assertTrue(ipSet.contains(LOCALHOST));
assertTrue(ipSet.contains("192.168.1"));
assertTrue(ipSet.contains("192.168.1.0"));
assertTrue(ipSet.contains("192.168.1.255"));
}
@Test
@@ -76,13 +77,13 @@ public class IPTableTest {
assertEquals(1, instance.toSet().size());
instance = new IPTable();
// Add IP range & then add an IP from within that range
// Add IP range w/ 256 addresses & then add an IP from within that range
instance.add("192.168.1");
instance.add("192.168.1.1");
// Verify only the range exists
Set<String> ipSet = instance.toSet();
assertEquals(1, ipSet.size());
assertTrue(ipSet.contains("192.168.1"));
assertEquals(256, ipSet.size());
assertTrue(ipSet.contains("192.168.1.1"));
instance = new IPTable();
// Now, switch order. Add IP address, then add a range encompassing that IP
@@ -90,8 +91,8 @@ public class IPTableTest {
instance.add("192.168.1");
// Verify only the range exists
ipSet = instance.toSet();
assertEquals(1, ipSet.size());
assertTrue(ipSet.contains("192.168.1"));
assertEquals(256, ipSet.size());
assertTrue(ipSet.contains("192.168.1.1"));
}
/**
@@ -120,6 +121,48 @@ public class IPTableTest {
assertTrue("IP within an add()ed range should match", contains);
}
@Test
public void testDashRangeContains() throws Exception {
IPTable instance = new IPTable();
instance.add("192.168.0.0 - 192.168.0.245");
assertTrue("Range should contain lower limit", instance.contains("192.168.0.0"));
assertTrue("Range should contain upper limit", instance.contains("192.168.0.245"));
assertTrue("Range should contain value in between limits", instance.contains("192.168.0.123"));
assertTrue("Range should contain value in between limits", instance.contains("192.168.0.234"));
assertFalse("Range should not contain value below lower limit", instance.contains("192.167.255.255"));
assertFalse("Range should not contain value above upper limit", instance.contains("192.168.0.246"));
}
@Test
public void testSubnetRangeContains() throws Exception {
IPTable instance = new IPTable();
instance.add("192.168.0.0/30"); // translates to 192.168.0.0 - 192.168.0.3
assertTrue("Range should contain lower limit", instance.contains("192.168.0.0"));
assertTrue("Range should contain upper limit", instance.contains("192.168.0.3"));
assertTrue("Range should contain values in between limits", instance.contains("192.168.0.1"));
assertTrue("Range should contain values in between limits", instance.contains("192.168.0.2"));
assertFalse("Range should not contain value below lower limit", instance.contains("192.167.255.255"));
assertFalse("Range should not contain value above upper limit", instance.contains("192.168.0.4"));
}
@Test
public void testImplicitRangeContains() throws Exception {
IPTable instance = new IPTable();
instance.add("192.168.1");
assertTrue("Range should contain lower limit", instance.contains("192.168.1.0"));
assertTrue("Range should contain upper limit", instance.contains("192.168.1.255"));
assertTrue("Range should contain values in between limits", instance.contains("192.168.1.123"));
assertTrue("Range should contain values in between limits", instance.contains("192.168.1.234"));
assertFalse("Range should not contain value below lower limit", instance.contains("192.168.0.0"));
assertFalse("Range should not contain value above upper limit", instance.contains("192.168.2.0"));
}
/**
* Test of isEmpty method, of class IPTable.
* @throws java.lang.Exception passed through.