/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.brooklyn.util.net;
import java.util.Arrays;
import org.apache.brooklyn.util.net.Cidr;
import org.testng.Assert;
import org.testng.annotations.Test;
public class CidrTest {
public static void assertBytesEquals(int[] actual, int[] expected) {
if (actual.length != expected.length)
Assert.fail("Arrays of different length: "+Arrays.toString(actual)+" actual, "+Arrays.toString(expected)+" expected");
for (int i=0; i<actual.length; i++)
if (actual[i]!=expected[i])
Assert.fail("Arrays differ in element "+i+": "+Arrays.toString(actual)+" actual, "+Arrays.toString(expected)+" expected");
}
@Test
public void test_10_0_0_0_String() {
Cidr c = new Cidr("10.0.0.0/8");
Assert.assertEquals(c.toString(), "10.0.0.0/8");
assertBytesEquals(c.getBytes(), new int[] { 10, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 8);
}
@Test
public void test_10_0_0_0_Byte() {
Cidr c = new Cidr(10);
Assert.assertEquals(c.toString(), "10.0.0.0/8");
assertBytesEquals(c.getBytes(), new int[] { 10, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 8);
}
@Test
public void test_10_0_0_0_ExtraBytes() {
Cidr c = new Cidr(10, 0);
Assert.assertEquals(c.toString(), "10.0.0.0/16");
assertBytesEquals(c.getBytes(), new int[] { 10, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 16);
}
@Test
public void test_0_0_0_0_Bytes() {
Cidr c = new Cidr();
Assert.assertEquals(c.toString(), "0.0.0.0/0");
assertBytesEquals(c.getBytes(), new int[] { 0, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 0);
}
@Test
public void test_0_0_0_0_32_Bytes() {
Cidr c = new Cidr(0, 0, 0, 0);
Assert.assertEquals(c.toString(), "0.0.0.0/32");
assertBytesEquals(c.getBytes(), new int[] { 0, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 32);
}
@Test
public void test_0_0_0_0_String() {
Cidr c = new Cidr("0.0.0.0/0");
Assert.assertEquals(c.toString(), "0.0.0.0/0");
assertBytesEquals(c.getBytes(), new int[] { 0, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 0);
}
@Test
public void test_0_0_0_0_32_String() {
Cidr c = new Cidr("0.0.0.0/32");
Assert.assertEquals(c.toString(), "0.0.0.0/32");
assertBytesEquals(c.getBytes(), new int[] { 0, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 32);
}
@Test
public void test_10_0_0_0_7_LessABit() {
Cidr c = new Cidr("10.0.0.0/7");
Assert.assertEquals(c.toString(), "10.0.0.0/7");
assertBytesEquals(c.getBytes(), new int[] { 10, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 7);
}
@Test
public void test_10_0_0_0_6_LessTwoBitsOneIsSignificant() {
Cidr c = new Cidr("10.0.0.1/6");
Assert.assertEquals(c.toString(), "8.0.0.0/6");
assertBytesEquals(c.getBytes(), new int[] { 8, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 6);
}
@Test
public void test_10_0_blah_6() {
Cidr c = new Cidr("10.0../6");
Assert.assertEquals(c.toString(), "8.0.0.0/6");
assertBytesEquals(c.getBytes(), new int[] { 8, 0, 0, 0 });
Assert.assertEquals(c.getLength(), 6);
}
@Test
public void testSubnet() {
Cidr c = new Cidr("0.0.0.0/0");
Cidr c10 = c.subnet(10);
Assert.assertEquals(c10, new Cidr(10));
Assert.assertEquals(c10.subnet(88, 1), new Cidr(10, 88, 1));
}
@Test
public void testNetmask() {
Cidr c = new Cidr(10, 0);
Assert.assertEquals(c.netmask().getHostAddress(), "255.255.0.0");
}
@Test
public void testNetmaskOdd() {
Cidr c = new Cidr("10.0/13");
Assert.assertEquals(c.netmask().getHostAddress(), "255.31.0.0");
}
@Test
public void testAddressAtOffset() {
Cidr c = new Cidr(10, 0);
Assert.assertEquals(c.addressAtOffset(3).getHostAddress(), "10.0.0.3");
Assert.assertEquals(c.addressAtOffset(256*256*8+1).getHostAddress(), "10.8.0.1");
}
@Test
public void testCommonPrefixLength() {
Cidr c1 = new Cidr("10.0.0.0/8");
Cidr c2 = new Cidr("11.0.0.0/8");
Assert.assertEquals(c1.commonPrefixLength(c2), 7);
Assert.assertEquals(c2.commonPrefixLength(c1), 7);
Assert.assertEquals(c2.commonPrefix(c1), c1.commonPrefix(c2));
Assert.assertEquals(c2.commonPrefix(c1), new Cidr("10.0../7"));
Cidr c1s = new Cidr("10.0../6");
Assert.assertEquals(c2.commonPrefixLength(c1s), 6);
Assert.assertTrue(c1s.contains(c1));
Assert.assertTrue(c1s.contains(c2));
Assert.assertFalse(c1.contains(c2));
Assert.assertFalse(c2.contains(c1));
}
@Test
public void testContains() {
Assert.assertTrue(Cidr._172_16.contains(new Cidr("172.17.0.1/32")));
Assert.assertFalse(Cidr._172_16.contains(new Cidr("172.144.0.1/32")));
}
@Test
public void testIsCanonical() {
Assert.assertTrue(Cidr.isCanonical("10.0.0.0/8"));
Assert.assertTrue(Cidr.isCanonical("10.0.0.0/16"));
Assert.assertTrue(Cidr.isCanonical(Cidr._172_16.toString()));
Assert.assertFalse(Cidr.isCanonical("10.0.0.1/8"));
Assert.assertFalse(Cidr.isCanonical("/0"));
Assert.assertFalse(Cidr.isCanonical("10.0.0.0/33"));
}
}