package jReto.routing;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import de.tum.in.www1.jReto.routing.algorithm.LinkStateRoutingTable;
import de.tum.in.www1.jReto.routing.algorithm.LinkStateRoutingTable.Change.NowReachableInformation;
public class RoutingTableTests {
@Test
public void testRoutingTableWithNeighbor() {
LinkStateRoutingTable<String> routingTable = new LinkStateRoutingTable<String>("Local");
LinkStateRoutingTable.Change<String> change = routingTable.getRoutingTableChangeForNeighborUpdate("A", 10);
assertTrue("New neighbor not reachable.", change.nowReachable.size() == 1);
assertTrue("Node unreachable", change.nowUnreachable.size() == 0);
assertTrue("Node unreachable", change.routeChanged.size() == 0);
assertTrue("Incorrect node reachable", change.nowReachable.get(0).nextHop.equals("A"));
assertTrue("Incorrect cost", change.nowReachable.get(0).cost == 10);
}
@Test
public void testRoutingTableWithIneffectualLinkStateInformation() {
LinkStateRoutingTable<String> routingTable = new LinkStateRoutingTable<String>("Local");
routingTable.getRoutingTableChangeForNeighborUpdate("A", 10);
LinkStateRoutingTable.Change<String> change =
routingTable.getRoutingTableChangeForLinkStateInformationUpdate("B",
Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("C", 1),
new LinkStateRoutingTable.NeighborInformation<String>("D", 1)
)
);
assertTrue("Change empty", change.isEmpty());
}
@Test
public void testRoutingTableWithEffectualLinkStateInformation() {
LinkStateRoutingTable<String> routingTable = new LinkStateRoutingTable<String>("Local");
routingTable.getRoutingTableChangeForNeighborUpdate("A", 10);
routingTable.getRoutingTableChangeForLinkStateInformationUpdate("B",
Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("C", 1),
new LinkStateRoutingTable.NeighborInformation<String>("D", 1)
)
);
LinkStateRoutingTable.Change<String> change = routingTable.getRoutingTableChangeForLinkStateInformationUpdate("A", Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("B", 1)));
assertTrue("New nodes reachable", change.nowReachable.size() == 3);
assertTrue("No other changes", change.nowUnreachable.size() == 0 && change.routeChanged.size() == 0);
Map<String, String> nextHops = new HashMap<>();
Map<String, Double> costs = new HashMap<>();
for (NowReachableInformation<String> nowReachable : change.nowReachable) {
nextHops.put(nowReachable.node, nowReachable.nextHop);
costs.put(nowReachable.node, nowReachable.cost);
}
assertTrue("B now reachable information correct", nextHops.get("B").equals("A") && costs.get("B") == 11);
assertTrue("C now reachable information correct", nextHops.get("C").equals("A") && costs.get("C") == 12);
assertTrue("D now reachable information correct", nextHops.get("D").equals("A") && costs.get("D") == 12);
}
@Test
public void testRoutingTableForRouteChanges() {
LinkStateRoutingTable<String> routingTable = new LinkStateRoutingTable<String>("Local");
routingTable.getRoutingTableChangeForNeighborUpdate("A", 10);
routingTable.getRoutingTableChangeForLinkStateInformationUpdate("B",
Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("C", 1),
new LinkStateRoutingTable.NeighborInformation<String>("D", 1)
)
);
routingTable.getRoutingTableChangeForLinkStateInformationUpdate("A", Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("B", 1)));
LinkStateRoutingTable.Change<String> change = routingTable.getRoutingTableChangeForNeighborUpdate("A", 5);
assertTrue("routes changed", change.routeChanged.size() == 4);
assertTrue("reachablitiy changed", change.nowReachable.size() == 0 && change.nowUnreachable.size() == 0);
}
@Test
public void testRoutingTableUnreachability() {
LinkStateRoutingTable<String> routingTable = new LinkStateRoutingTable<String>("Local");
routingTable.getRoutingTableChangeForNeighborUpdate("A", 10);
routingTable.getRoutingTableChangeForLinkStateInformationUpdate("A", Arrays.asList(new LinkStateRoutingTable.NeighborInformation<String>("B", 1)));
LinkStateRoutingTable.Change<String> change = routingTable.getRoutingTableChangeForNeighborRemoval("A");
assertTrue("nodes got unreachable", change.nowUnreachable.size() == 2);
assertTrue("no other changes", change.nowReachable.size() == 0 && change.routeChanged.size() ==0 );
}
}