blob: 1d1034c1c518316a7482c088de588f1c310d471b [file] [log] [blame]
package net.onrc.onos.apps.sdnip;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.junit.Test;
import com.google.common.net.InetAddresses;
import com.googlecode.concurrenttrees.radix.node.concrete.DefaultByteArrayNodeFactory;
import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree;
import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree;
/**
* Sanity tests for the InvertedRadixTree.
* <p/>
* These tests are used to verify that the InvertedRadixTree provides the
* functionality we need to fit our use case.
*/
public class RadixTreeTest {
private Map<String, Interface> interfaces;
private InvertedRadixTree<Interface> interfaceRoutes;
private Interface longestInterfacePrefixMatch(InetAddress address) {
Prefix prefixToSearchFor = new Prefix(address.getAddress(),
Prefix.MAX_PREFIX_LENGTH);
Iterator<Interface> it =
interfaceRoutes.getValuesForKeysPrefixing(
prefixToSearchFor.toBinaryString()).iterator();
Interface intf = null;
// Find the last prefix, which will be the longest prefix
while (it.hasNext()) {
intf = it.next();
}
return intf;
}
/**
* This is just a test of the InvertedRadixTree, rather than an actual unit
* test of SdnIp. It tests that the algorithm used to retrieve the
* longest prefix match from the tree actually does retrieve the longest
* prefix, and not just any matching prefix.
*/
@Test
public void getOutgoingInterfaceTest() {
interfaces = new HashMap<>();
interfaceRoutes = new ConcurrentInvertedRadixTree<>(
new DefaultByteArrayNodeFactory());
Interface interface1 = new Interface("sw3-eth1", "00:00:00:00:00:00:00:a3",
(short) 1, "192.168.10.101", 24);
interfaces.put(interface1.getName(), interface1);
Interface interface2 = new Interface("sw5-eth1", "00:00:00:00:00:00:00:a5",
(short) 1, "192.168.20.101", 16);
interfaces.put(interface2.getName(), interface2);
Interface interface3 = new Interface("sw2-eth1", "00:00:00:00:00:00:00:a2",
(short) 1, "192.168.60.101", 16);
interfaces.put(interface3.getName(), interface3);
Interface interface4 = new Interface("sw6-eth1", "00:00:00:00:00:00:00:a6",
(short) 1, "192.168.60.101", 30);
interfaces.put(interface4.getName(), interface4);
Interface interface5 = new Interface("sw4-eth4", "00:00:00:00:00:00:00:a4",
(short) 4, "192.168.60.101", 24);
interfaces.put(interface5.getName(), interface5);
for (Interface intf : interfaces.values()) {
Prefix prefix = new Prefix(intf.getIpAddress().getAddress(),
intf.getPrefixLength());
interfaceRoutes.put(prefix.toBinaryString(), intf);
}
// Check whether the prefix length takes effect
InetAddress nextHopAddress = InetAddresses.forString("192.0.0.1");
assertNotNull(nextHopAddress);
assertNull(longestInterfacePrefixMatch(nextHopAddress));
// Check whether it returns the longest matchable address
nextHopAddress = InetAddresses.forString("192.168.60.101");
assertEquals("sw6-eth1", longestInterfacePrefixMatch(nextHopAddress).getName());
}
}