package water.init; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import water.AutoBuffer; import water.util.ArrayUtils; import water.util.MathUtils; import static water.TestUtil.ar; import static water.TestUtil.ari; /** * Test to verify correctness of network algebra. */ public class NetworkInitTest { @Test public void testIPV4CidrBlocks() { NetworkInit.CIDRBlock c1 = NetworkInit.CIDRBlock.parse("128.0.0.1/32"); Assert.assertEquals(32, c1.bits); Assert.assertArrayEquals(ari(128, 0, 0, 1), c1.ip); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(ari(128, 0, 0, 1)))); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(ari(128, 0, 0, 2)))); c1 = NetworkInit.CIDRBlock.parse("128.0.0.1/0"); Assert.assertEquals(0, c1.bits); Assert.assertArrayEquals(ari(128, 0, 0, 1), c1.ip); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(ari(128, 0, 0, 1)))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(ari(128, 0, 0, 2)))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(ari(255, 255, 255, 255)))); c1 = NetworkInit.CIDRBlock.parse("10.10.1.32/27"); Assert.assertEquals(27, c1.bits); Assert.assertArrayEquals(ari(10, 10, 1, 32), c1.ip); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(ari(10, 10, 1, 44)))); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(ari(10, 10, 1, 90)))); c1 = NetworkInit.CIDRBlock.parse("128.0.0.1/42"); Assert.assertNull(c1); c1 = NetworkInit.CIDRBlock.parse("128.1/21"); Assert.assertNull(c1); c1 = NetworkInit.CIDRBlock.parse("1.1.257.1/21"); Assert.assertNull(c1); } @Test public void testIPV6CidrBlocks() { NetworkInit.CIDRBlock c1 = NetworkInit.CIDRBlock.parse("0:0:0:0:0:0:0:1/128"); Assert.assertEquals(128, c1.bits); Assert.assertArrayEquals(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 1)), c1.ip); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 1))))); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 2))))); c1 = NetworkInit.CIDRBlock.parse("0:0:0:0:0:0:0:1/0"); Assert.assertEquals(0, c1.bits); Assert.assertArrayEquals(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 1)), c1.ip); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 1))))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 2))))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff))))); c1 = NetworkInit.CIDRBlock.parse("2001:db8:1234:0:0:0:0:0/48"); Assert.assertEquals(48, c1.bits); Assert.assertArrayEquals(toOctects(ari(0x2001, 0xdb8, 0x1234, 0, 0, 0, 0, 0)), c1.ip); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0, 0, 0, 0, 0, 0, 0, 1))))); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0x2001, 0xdb8, 0x1233, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff))))); Assert.assertFalse(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0x2001, 0xdb8, 0x1235, 0, 0, 0, 0, 0))))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0x2001, 0xdb8, 0x1234, 0, 0, 0, 0, 0))))); // First address in the block Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0x2001, 0xdb8, 0x1234, 0x0001, 0x9988, 0x7766, 0xdead, 0xbabe))))); Assert.assertTrue(c1.isInetAddressOnNetwork(toByte(toOctects(ari(0x2001, 0xdb8, 0x1234, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff))))); // The last address in the block c1 = NetworkInit.CIDRBlock.parse("0:0:0:0:0:0:0:1/129"); Assert.assertNull(c1); c1 = NetworkInit.CIDRBlock.parse("::1/128"); Assert.assertNull(c1); c1 = NetworkInit.CIDRBlock.parse("1.1.257.1/42"); Assert.assertNull(c1); } // Test for H2OKey @Test public void testIPv6AddressEncoding() { byte[] address = toByte(toOctects(ari(0x2001, 0xdb8, 0x1234, 0x0001, 0x9988, 0x7766, 0xdead, 0xbabe))); long high = ArrayUtils.encodeAsLong(address, 8, 8); long low = ArrayUtils.encodeAsLong(address, 0, 8); AutoBuffer ab = new AutoBuffer(); byte[] returnedAddress = ab.put8(low).put8(high).flipForReading().getA1(16); Assert.assertArrayEquals(address, returnedAddress); } // Test for H2OKey @Test public void testIPv4AddressEncoding() { byte[] address = toByte(ari(10, 10, 1, 44)); int ipv4 = (int) ArrayUtils.encodeAsLong(address); AutoBuffer ab = new AutoBuffer(); byte[] returnedAddress = ab.put4(ipv4).flipForReading().getA1(4); Assert.assertArrayEquals(address, returnedAddress); } @Test public void testUnsignedOps() { Assert.assertEquals(-1, MathUtils.compareUnsigned(0x00L, 0xFFL)); Assert.assertEquals(-1, MathUtils.compareUnsigned(0xFFFFFFFFFFFFFFFEL, 0xFFFFFFFFFFFFFFFFL)); Assert.assertEquals(-1, MathUtils.compareUnsigned(0xFFFFFFFFFFFFFFFFL & ~0x80FFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL)); Assert.assertEquals( 0, MathUtils.compareUnsigned(0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL)); Assert.assertEquals(-1, MathUtils.compareUnsigned(0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFEL, 0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL)); Assert.assertEquals(-1, MathUtils.compareUnsigned(0x00L, 0xFFFFFFFFFFFFFFFFL, 0x01L, 0xFFFFFFFFFFFFFFFFL)); Assert.assertEquals(-1, MathUtils.compareUnsigned(0x00L, 0x00L, 0x00L, 0x01L)); } static byte[] toByte(int[] ary) { return ArrayUtils.toByteArray(ary); } static int[] toOctects(int[] doubleOctets) { int[] r = new int[doubleOctets.length*2]; for (int i = 0; i < doubleOctets.length; i++) { r[2*i + 0] = (doubleOctets[i] >> 8) & 0xff; r[2*i + 1] = doubleOctets[i] & 0xff; } return r; } }