blob: 957cbe0518c9d067b211967c032b1bb06e787c57 [file] [log] [blame]
package net.onrc.onos.apps.sdnip;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class PrefixTest {
private List<PrefixTestData> testPrefixes;
private class PrefixTestData {
public final String dotNotation;
public final String binaryNotation;
public final int prefixLength;
public PrefixTestData(String dotNotation, int prefixLength,
String binaryNotation) {
this.dotNotation = dotNotation;
this.prefixLength = prefixLength;
this.binaryNotation = binaryNotation;
}
}
@Before
public void setUp() throws Exception {
testPrefixes = new LinkedList<>();
testPrefixes.add(new PrefixTestData("0.0.0.0", 0, ""));
testPrefixes.add(new PrefixTestData("192.168.166.0", 22,
"1100000010101000101001"));
testPrefixes.add(new PrefixTestData("192.168.166.0", 23,
"11000000101010001010011"));
testPrefixes.add(new PrefixTestData("192.168.166.0", 24,
"110000001010100010100110"));
testPrefixes.add(new PrefixTestData("130.162.10.1", 25,
"1000001010100010000010100"));
testPrefixes.add(new PrefixTestData("255.255.255.255", 32,
"11111111111111111111111111111111"));
}
@After
public void tearDown() throws Exception {
}
@Test
public void testNewPrefixFromByteArray() {
byte[] b1 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
byte[] b2 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0xff, (byte) 0xff};
byte[] b3 = new byte[]{(byte) 0x8f, (byte) 0xac, (byte) 0x00, (byte) 0x00};
byte[] b4 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
Prefix p1 = new Prefix(b1, 12);
Prefix p2 = new Prefix(b2, 12);
Prefix p3 = new Prefix(b3, 12);
Prefix p4 = new Prefix(b4, 11);
// Different input byte arrays, but Prefixes should be equal after
// construction
assertTrue(p1.equals(p2));
assertTrue(p2.equals(p3));
// Same input byte array, but should be false
assertFalse(p1.equals(p4));
assertTrue(Arrays.equals(p1.getAddress(), p3.getAddress()));
assertTrue(p1.toString().equals(p2.toString()));
assertTrue(Arrays.equals(p1.getAddress(), p4.getAddress()));
assertFalse(p1.toString().equals(p4.toString()));
}
@Test
public void testPrefixString() {
Prefix p1 = new Prefix("192.168.166.0", 24);
Prefix p2 = new Prefix("192.168.166.0", 23);
Prefix p3 = new Prefix("192.168.166.128", 24);
Prefix p4 = new Prefix("192.168.166.128", 25);
assertFalse(p1.equals(p2));
assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
assertTrue(p1.equals(p3));
assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
assertFalse(p3.equals(p4));
assertFalse(Arrays.equals(p3.getAddress(), p4.getAddress()));
assertTrue(p1.toString().equals(p3.toString()));
assertEquals(p1.hashCode(), p3.hashCode());
}
@Test
public void testPrefixReturnsSame() {
// Create a prefix of all ones for each prefix length.
// Check that Prefix doesn't mangle it
for (int prefixLength = 1; prefixLength <= Prefix.MAX_PREFIX_LENGTH; prefixLength++) {
byte[] address = new byte[Prefix.ADDRESS_LENGTH_BYTES];
int lastByte = (prefixLength - 1) / Byte.SIZE;
int lastBit = (prefixLength - 1) % Byte.SIZE;
for (int j = 0; j < address.length; j++) {
if (j < lastByte) {
address[j] = (byte) 0xff;
} else if (j == lastByte) {
byte b = 0;
byte msb = (byte) 0x80;
for (int k = 0; k < Byte.SIZE; k++) {
if (k <= lastBit) {
b |= (msb >> k);
}
}
address[j] = b;
} else {
address[j] = 0;
}
}
Prefix p = new Prefix(address, prefixLength);
assertTrue(Arrays.equals(address, p.getAddress()));
}
}
@Test
public void testToBinaryString() {
for (PrefixTestData testPrefix : testPrefixes) {
Prefix p = new Prefix(testPrefix.dotNotation, testPrefix.prefixLength);
assertEquals(testPrefix.binaryNotation, p.toBinaryString());
assertEquals(p.getPrefixLength(), p.toBinaryString().length());
}
}
@Test(expected = IllegalArgumentException.class)
public void testStringConstructorPrefixLengthTooSmall() {
String s = "255.255.255.255";
// Check the first valid prefix length works
Prefix p = new Prefix(s, Prefix.MIN_PREFIX_LENGTH);
assertNotNull(p);
// Should throw IllegalArgumentException
new Prefix(s, Prefix.MIN_PREFIX_LENGTH - 1);
}
@Test(expected = IllegalArgumentException.class)
public void testStringConstructorPrefixLengthTooLarge() {
String s = "255.255.255.255";
// Check the last valid prefix length works
Prefix p = new Prefix(s, Prefix.MAX_PREFIX_LENGTH);
assertNotNull(p);
// Should throw IllegalArgumentException
new Prefix(s, Prefix.MAX_PREFIX_LENGTH + 1);
}
@Test(expected = IllegalArgumentException.class)
public void testByteConstructorPrefixLengthTooSmall() {
byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
// Check the first valid prefix length works
Prefix p = new Prefix(b, Prefix.MIN_PREFIX_LENGTH);
assertNotNull(p);
// Should throw IllegalArgumentException
new Prefix(b, Prefix.MIN_PREFIX_LENGTH - 1);
}
@Test(expected = IllegalArgumentException.class)
public void testByteConstructorPrefixLengthTooLarge() {
byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
// Check the last valid prefix length works
Prefix p = new Prefix(b, Prefix.MAX_PREFIX_LENGTH);
assertNotNull(p);
// Should throw IllegalArgumentException
new Prefix(b, Prefix.MAX_PREFIX_LENGTH + 1);
}
@Test
public void testFromBinaryString() {
Map<String, String> binaryToDecimalDot = new HashMap<>();
binaryToDecimalDot.put("", "0.0.0.0/0");
binaryToDecimalDot.put("1", "128.0.0.0/1");
binaryToDecimalDot.put("10000001", "129.0.0.0/8");
binaryToDecimalDot.put("1011011110", "183.128.0.0/10");
binaryToDecimalDot.put("01001101000000001010010110110101", "77.0.165.181/32");
for (Map.Entry<String, String> entry : binaryToDecimalDot.entrySet()) {
Prefix p = Prefix.fromBinaryString(entry.getKey());
assertEquals(entry.getValue(), p.toString());
}
}
@Test
public void testFromBinaryStringInvalidInput() {
try {
Prefix.fromBinaryString("34102");
fail("Non-binary input should throw an exception");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
try {
Prefix.fromBinaryString("-0101");
fail("Non-binary input should throw an exception");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
try {
Prefix.fromBinaryString("01010101010101010101010101010102");
fail("Non-binary input should throw an exception");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
try {
Prefix.fromBinaryString("010101010101010101010101010101011");
fail("Input too long should throw an exception");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
}
}