/*
* Copyright (c) 2013 Big Switch Networks, Inc.
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
*
* 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.sdnplatform.util;
import java.util.List;
import java.util.Map.Entry;
import org.junit.Test;
import org.sdnplatform.packet.IPv4;
import org.sdnplatform.util.IPV4Subnet;
import org.sdnplatform.util.IPV4SubnetTrie;
import junit.framework.TestCase;
public class IPv4TrieTest extends TestCase {
private static class TrieTest {
public int address;
public short bits;
public String resultExpected;
public TrieTest(String address, String resultExpected) {
super();
this.address = IPv4.toIPv4Address(address);
this.bits = 32;
this.resultExpected = resultExpected;
}
public TrieTest(String address, int bits, String resultExpected) {
super();
this.address = IPv4.toIPv4Address(address);
this.bits = (short)bits;
this.resultExpected = resultExpected;
}
}
private void addToTrie(IPV4SubnetTrie<String> ipTrie, IPV4Subnet subnet) {
ipTrie.put(subnet, IPv4.fromIPv4Address((int)subnet.address) + "/" + subnet.maskBits);
}
private void doTriePrefixTest(IPV4SubnetTrie<String> ipTrie, TrieTest test) {
IPV4Subnet s = new IPV4Subnet();
s.address = test.address;
s.maskBits = test.bits;
boolean foundmatch = false;
StringBuffer sb = new StringBuffer("Prefix matches (expecting: ");
sb.append(test.resultExpected);
sb.append("), got: ");
List<Entry<IPV4Subnet, String>> psearch = ipTrie.prefixSearch(s);
for (Entry<IPV4Subnet, String> curEntry : psearch) {
sb.append(curEntry.getValue() + ",");
if (test.resultExpected.equals(curEntry.getValue())) {
foundmatch = true;
}
}
assertTrue(sb.toString(), foundmatch);
}
private void doTrieGetTest(IPV4SubnetTrie<String> ipTrie, TrieTest test) {
IPV4Subnet s = new IPV4Subnet();
s.maskBits = test.bits;
s.address = test.address;
assertEquals(test.resultExpected, ipTrie.get(s));
}
private IPV4Subnet getSub(String address, int i) {
IPV4Subnet s = new IPV4Subnet();
s.maskBits = (short)i;
s.address = IPv4.toIPv4Address(address);
return s;
}
@Test
public void testIsBitSet() {
IPV4Subnet s = getSub("192.168.1.1", 32);
assertTrue(IPV4SubnetTrie.isBitSet(s, 0));
assertTrue(IPV4SubnetTrie.isBitSet(s, 1));
assertFalse(IPV4SubnetTrie.isBitSet(s, 2));
assertFalse(IPV4SubnetTrie.isBitSet(s, 7));
assertTrue(IPV4SubnetTrie.isBitSet(s, 8));
assertFalse(IPV4SubnetTrie.isBitSet(s, 9));
assertTrue(IPV4SubnetTrie.isBitSet(s, 31));
}
@Test
public void testIsPrefix() {
IPV4Subnet s1 = getSub("192.168.1.1", 32);
IPV4Subnet s2 = getSub("192.168.1.1", 16);
IPV4Subnet s3 = getSub("192.168.2.1", 24);
IPV4Subnet s4 = getSub("192.168.3.1", 24);
IPV4Subnet s5 = getSub("192.168.3.127", 32);
assertTrue(IPV4SubnetTrie.isPrefix(s1, s2));
assertFalse(IPV4SubnetTrie.isPrefix(s2, s3));
assertFalse(IPV4SubnetTrie.isPrefix(s1, s3));
assertFalse(IPV4SubnetTrie.isPrefix(s2, s3));
assertTrue(IPV4SubnetTrie.isPrefix(s5, s4));
assertFalse(IPV4SubnetTrie.isPrefix(s5, s3));
}
@Test
public void testIPv4TrieBasic() {
IPV4SubnetTrie<String> ipTrie = new IPV4SubnetTrie<String>();
addToTrie(ipTrie, getSub("192.168.0.0", 16));
addToTrie(ipTrie, getSub("192.168.2.0", 24));
addToTrie(ipTrie, getSub("192.168.3.0", 24));
addToTrie(ipTrie, getSub("192.168.3.252", 30));
addToTrie(ipTrie, getSub("4.4.4.0", 24));
addToTrie(ipTrie, getSub("10.0.1.1", 32));
doTrieGetTest(ipTrie, new TrieTest("192.168.0.0", 16, "192.168.0.0/16"));
doTrieGetTest(ipTrie, new TrieTest("192.168.2.0", 24, "192.168.2.0/24"));
doTrieGetTest(ipTrie, new TrieTest("192.168.3.0", 24, "192.168.3.0/24"));
doTrieGetTest(ipTrie, new TrieTest("192.168.3.252", 30, "192.168.3.252/30"));
doTrieGetTest(ipTrie, new TrieTest("4.4.4.0", 24, "4.4.4.0/24"));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.1", 32, "10.0.1.1/32"));
doTrieGetTest(ipTrie, new TrieTest("4.4.4.0", 25, null));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.1", 31, null));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.2", 32, null));
ipTrie = new IPV4SubnetTrie<String>();
addToTrie(ipTrie, getSub("192.168.3.252", 30));
addToTrie(ipTrie, getSub("192.168.0.0", 16));
doTrieGetTest(ipTrie, new TrieTest("192.168.0.0", 16, "192.168.0.0/16"));
doTrieGetTest(ipTrie, new TrieTest("192.168.3.252", 30, "192.168.3.252/30"));
ipTrie = new IPV4SubnetTrie<String>();
addToTrie(ipTrie, getSub("192.168.3.252", 30));
addToTrie(ipTrie, getSub("192.168.3.0", 24));
addToTrie(ipTrie, getSub("192.168.0.0", 16));
addToTrie(ipTrie, getSub("192.168.2.0", 24));
addToTrie(ipTrie, getSub("10.0.1.1", 32));
addToTrie(ipTrie, getSub("4.4.4.0", 24));
doTrieGetTest(ipTrie, new TrieTest("192.168.0.0", 16, "192.168.0.0/16"));
doTrieGetTest(ipTrie, new TrieTest("192.168.2.0", 24, "192.168.2.0/24"));
doTrieGetTest(ipTrie, new TrieTest("192.168.3.0", 24, "192.168.3.0/24"));
doTrieGetTest(ipTrie, new TrieTest("192.168.3.252", 30, "192.168.3.252/30"));
doTrieGetTest(ipTrie, new TrieTest("4.4.4.0", 24, "4.4.4.0/24"));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.1", 32, "10.0.1.1/32"));
doTrieGetTest(ipTrie, new TrieTest("4.4.4.0", 25, null));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.1", 31, null));
doTrieGetTest(ipTrie, new TrieTest("10.0.1.2", 32, null));
}
@Test
public void testIPv4TriePrefix() {
IPV4SubnetTrie<String> ipTrie = new IPV4SubnetTrie<String>();
addToTrie(ipTrie, getSub("192.168.0.0", 16));
addToTrie(ipTrie, getSub("192.168.2.0", 24));
addToTrie(ipTrie, getSub("192.168.3.0", 24));
addToTrie(ipTrie, getSub("192.168.3.252", 30));
addToTrie(ipTrie, getSub("4.4.4.0", 24));
addToTrie(ipTrie, getSub("10.0.1.1", 32));
doTriePrefixTest(ipTrie, new TrieTest("192.168.1.1", "192.168.0.0/16"));
doTriePrefixTest(ipTrie, new TrieTest("192.168.2.1", "192.168.2.0/24"));
doTriePrefixTest(ipTrie, new TrieTest("192.168.3.1", "192.168.3.0/24"));
doTriePrefixTest(ipTrie, new TrieTest("192.168.3.252", "192.168.3.0/24"));
doTriePrefixTest(ipTrie, new TrieTest("192.168.3.252", "192.168.3.252/30"));
doTriePrefixTest(ipTrie, new TrieTest("4.4.4.255", "4.4.4.0/24"));
doTriePrefixTest(ipTrie, new TrieTest("10.0.1.1", "10.0.1.1/32"));
}
}