/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.routing.internal; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import de.rcenvironment.core.communication.common.IdentifierException; import de.rcenvironment.core.communication.common.InstanceNodeSessionId; import de.rcenvironment.core.communication.common.NodeIdentifierTestUtils; import junit.framework.TestCase; /** * Unit tests for {@link TopologyMap}. * * @author Phillip Kroll * @author Robert Mischke */ public class TopologyMapTest extends TestCase { private static final int SHORT_TIMESTAMP_CHANGING_DELAY = 150; private static final String DIFFERENT_NUMBER_OF_VERTICES_IN_GRAPH_EXPECTED = "Different number of vertices in graph expected."; private static final String DIFFERENT_NUMBER_OF_EDGES_IN_GRAPH_EXPECTED = "Different number of edges in graph expected."; private static final String GRAPH_SHOULD_CONTAIN_CHANNEL = "Graph is expected to contain channel."; private static final String GRAPH_CONTAINS_CHANNEL = "Graph is expected to NOT contain channel."; private static final String GRAPH_DOES_NOT_CONTAIN_NODE = "Graph is expected to NOT contain platform."; private static final String GRAPH_CONTAINS_NODE = "Graph is expected to contain platform."; private static final String LSA_CAUSED_NO_UPDATE = "Merging this LSA into a graph was not considered an update as expected"; private static final String LSA_CAUSED_UPDATE = "Merging this LSA into a graph was considered an update when it shouldn't"; private static final InstanceNodeSessionId NODE_1 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("node1"); private static final InstanceNodeSessionId NODE_2 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("node2"); private static final InstanceNodeSessionId NODE_3 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("node3"); private static final InstanceNodeSessionId NODE_4 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("node4"); private static final InstanceNodeSessionId NODE_5 = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("node5"); private static final String NODE_1_NAME = "Name1"; private static final String NODE_2_NAME = "Name2"; private static final String NODE_4_NAME = "Name4"; private static final String CONNECTION_ID_1 = "#1"; private static final String CONNECTION_ID_2 = "#2"; private static final String CONNECTION_ID_3 = "#3"; @Deprecated // was used for sequence numbers, which does not work anymore private static final int ARBITRARY_INT = 4711; protected TopologyMap networkGraph; private final Log log = LogFactory.getLog(getClass()); @Override protected void setUp() throws Exception {} @Override protected void tearDown() throws Exception {} /** * Test for {@link TopologyMap#getAllLinks()}. */ public final void testGetChannels() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_1, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_3, CONNECTION_ID_1); assertEquals(3, networkGraph.getAllLinks().size()); assertNotNull(networkGraph.getLinkForConnection(CONNECTION_ID_1)); assertEquals(networkGraph.getLinkForConnection(CONNECTION_ID_1), new TopologyLink(NODE_1, NODE_2, CONNECTION_ID_1)); networkGraph.removeLink(null); networkGraph.removeLink(networkGraph.getLinkForConnection(CONNECTION_ID_1)); assertEquals(2, networkGraph.getAllLinks().size()); assertFalse(networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertFalse(networkGraph.containsLink(NODE_1, NODE_2, CONNECTION_ID_1)); } /** * Simple test for graph setup: NODE_1 - NODE_2 - NODE_3. */ public final void testGraphSetUp() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); assertTrue(GRAPH_CONTAINS_NODE, networkGraph.containsNode(NODE_1)); assertTrue(GRAPH_CONTAINS_NODE, networkGraph.containsNode(NODE_2)); assertTrue(GRAPH_CONTAINS_NODE, networkGraph.containsNode(NODE_3)); assertFalse(GRAPH_DOES_NOT_CONTAIN_NODE, networkGraph.containsNode(NODE_4)); assertFalse(GRAPH_DOES_NOT_CONTAIN_NODE, networkGraph.containsNode(NODE_5)); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_3, CONNECTION_ID_1); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_3)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_4, NODE_5)); assertEquals(DIFFERENT_NUMBER_OF_EDGES_IN_GRAPH_EXPECTED, 2, networkGraph.getLinkCount()); assertEquals(DIFFERENT_NUMBER_OF_VERTICES_IN_GRAPH_EXPECTED, 3, networkGraph.getNodeCount()); } /** * */ public final void testLinkStateAdvertisement() { LinkStateAdvertisement linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_1, NODE_1_NAME, true, ARBITRARY_INT, ARBITRARY_INT, true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_1, NODE_2, CONNECTION_ID_1), new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1) })); assertEquals(linkStateAdvertisement.getOwner(), NODE_1); assertEquals(linkStateAdvertisement.getSequenceNumber(), ARBITRARY_INT); } /** * Build graph and do manipulations with some {@link LinkStateAdvertisement}s. */ public final void testUpdateGraph() { // IMPORTANT: the test graph must be "owned" by a node that is not used in the test, // as TopologyMap was made to ignore external updates for its local node networkGraph = new TopologyMap(NODE_3); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_3)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_3, CONNECTION_ID_2); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_3)); LinkStateAdvertisement lsa = LinkStateAdvertisement.createUpdateLsa(NODE_1, NODE_1_NAME, true, networkGraph.getSequenceNumberOfNode(NODE_1) + 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_1, NODE_2, CONNECTION_ID_1), new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_3) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(lsa)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_3)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); lsa = LinkStateAdvertisement.createUpdateLsa(NODE_1, NODE_1_NAME, true, networkGraph.getSequenceNumberOfNode(NODE_1) + 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(lsa)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_3)); // inject a new node (NODE_4) via LSA lsa = LinkStateAdvertisement.createUpdateLsa(NODE_4, NODE_4_NAME, true, 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_4, NODE_3, CONNECTION_ID_1), new TopologyLink(NODE_4, NODE_2, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(lsa)); assertTrue(GRAPH_CONTAINS_NODE, networkGraph.containsNode(NODE_4)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_4, NODE_3)); lsa = LinkStateAdvertisement.createUpdateLsa(NODE_4, NODE_4_NAME, true, networkGraph.getSequenceNumberOfNode(NODE_4) + 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_4, NODE_5, CONNECTION_ID_1) })); assertFalse(GRAPH_DOES_NOT_CONTAIN_NODE, networkGraph.containsNode(NODE_5)); // log.info(NetworkFormatter.summary(networkGraph)); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(lsa)); assertTrue(GRAPH_CONTAINS_NODE, networkGraph.containsNode(NODE_5)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_4, NODE_5)); } /** * Build graph and do manipulations with some {@link LinkStateAdvertisement}s. */ public final void testEmptyGraphUpdate() { networkGraph = new TopologyMap(NODE_1); LinkStateAdvertisement linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_2, NODE_1, CONNECTION_ID_1), new TopologyLink(NODE_2, NODE_3, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(linkStateAdvertisement)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_1)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT + 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] {})); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(linkStateAdvertisement)); assertEquals(DIFFERENT_NUMBER_OF_EDGES_IN_GRAPH_EXPECTED, 0, networkGraph.getLinkCount()); assertEquals(DIFFERENT_NUMBER_OF_VERTICES_IN_GRAPH_EXPECTED, 3, networkGraph.getNodeCount()); } /** * Test graph updates with different {@link LinkStateAdvertisement}s. */ public final void testSequenceNumberUpdate() { networkGraph = new TopologyMap(NODE_1); LinkStateAdvertisement linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_2, NODE_1, CONNECTION_ID_1), new TopologyLink(NODE_2, NODE_3, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(linkStateAdvertisement)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_1)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); // this should be ignored, because the sequence number is to small/old linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT - 1, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] {})); assertFalse(LSA_CAUSED_UPDATE, networkGraph.update(linkStateAdvertisement)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_1)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); } /** * TODO @krol_ph: Test description. */ public final void testUpdateGraphEdges() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_2); // should succeed networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); // note: changed to assertFalse() after switch from NCP to connection ids try { networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); fail("Exception expected"); } catch (IllegalStateException e) { assertTrue(true); } // note: changed to assertFalse() after switch from NCP to connection ids assertFalse(networkGraph.addLink(new TopologyLink(NODE_1, NODE_2, CONNECTION_ID_1))); networkGraph.getLinkForConnection(CONNECTION_ID_1).incReliability(); networkGraph.getLinkForConnection(CONNECTION_ID_1).setWeight(7); assertEquals(1, networkGraph.getLinkForConnection(CONNECTION_ID_1).getReliability()); assertEquals(7, networkGraph.getLinkForConnection(CONNECTION_ID_1).getWeight()); } /** * Test graph updates with different {@link LinkStateAdvertisement}s. */ public final void testLsaIntegration1() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); LinkStateAdvertisement linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_2, NODE_1, CONNECTION_ID_1), new TopologyLink(NODE_2, NODE_3, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(linkStateAdvertisement)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_1)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); } /** * Test graph updates with different {@link LinkStateAdvertisement}s. */ public final void testLsaIntegration2() { TopologyMap graph1 = new TopologyMap(NODE_1); TopologyMap graph2 = new TopologyMap(NODE_3); graph1.addLink(NODE_1, NODE_3, CONNECTION_ID_1); graph2.addLink(NODE_3, NODE_1, CONNECTION_ID_1); assertFalse(graph1.equals(graph2)); graph1.update(graph2.generateNewLocalLSA()); graph2.update(graph1.generateNewLocalLSA()); assertEquals(graph2.generateNewLocalLSA().getGraphHashCode(), graph2.hashCode()); assertEquals(graph1, graph2); } /** * Test if channels are usable in both directions. */ public final void testDirectedEdges() { networkGraph = new TopologyMap(NODE_1); LinkStateAdvertisement linkStateAdvertisement = LinkStateAdvertisement.createUpdateLsa(NODE_2, NODE_2_NAME, true, ARBITRARY_INT, networkGraph.hashCode(), true, Arrays.asList(new TopologyLink[] { new TopologyLink(NODE_2, NODE_1, CONNECTION_ID_1), new TopologyLink(NODE_2, NODE_3, CONNECTION_ID_1) })); assertTrue(LSA_CAUSED_NO_UPDATE, networkGraph.update(linkStateAdvertisement)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_1)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_1, NODE_2)); assertTrue(GRAPH_SHOULD_CONTAIN_CHANNEL, networkGraph.containsLinkBetween(NODE_2, NODE_3)); assertFalse(GRAPH_CONTAINS_CHANNEL, networkGraph.containsLinkBetween(NODE_3, NODE_2)); } /** * Test cloning. */ public final void testCloning() { TopologyLink c1 = new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1); TopologyLink c2 = new TopologyLink(NODE_2, NODE_3, CONNECTION_ID_1); assertFalse(c1.equals(c2)); assertEquals(c1, c1.clone()); assertEquals(c1.clone(), c1.clone()); assertNotSame(c1, c1.clone()); assertNotSame(c1.clone(), c1.clone()); TopologyNode n1 = new TopologyNode(NODE_1); TopologyNode n2 = new TopologyNode(NODE_2); assertFalse(n1.equals(n2)); assertEquals(n1, n1.clone()); assertEquals(n1.clone(), n1.clone()); assertNotSame(n1, n1.clone()); assertNotSame(n1.clone(), n1.clone()); } /** * Tests for {@link TopologyLink#equals(Object)}. */ public final void testEqualChannels() { // should be equal assertEquals(new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1), new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1)); // should not be equal assertFalse((new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1)).equals(new TopologyLink(NODE_3, NODE_1, CONNECTION_ID_1))); // should not be equal assertFalse((new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_1)).equals(new TopologyLink(NODE_1, NODE_3, CONNECTION_ID_2))); } /** * Test for {@link TopologyMap#getAllLinksBetween(TopologyNode, TopologyNode)}. */ public final void testAvailableChannels() { TopologyMap graph = new TopologyMap(NODE_2); graph.addNode(NODE_1); assertEquals(0, graph.getAllLinksBetween(graph.getNode(NODE_2), graph.getNode(NODE_1)).size()); graph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); assertEquals(0, graph.getAllLinksBetween(graph.getNode(NODE_2), graph.getNode(NODE_1)).size()); assertEquals(1, graph.getAllLinksBetween(graph.getNode(NODE_1), graph.getNode(NODE_2)).size()); graph.addLink(NODE_1, NODE_2, CONNECTION_ID_2); assertEquals(0, graph.getAllLinksBetween(graph.getNode(NODE_2), graph.getNode(NODE_1)).size()); assertEquals(2, graph.getAllLinksBetween(graph.getNode(NODE_1), graph.getNode(NODE_2)).size()); graph.addLink(NODE_2, NODE_1, CONNECTION_ID_1); assertEquals(1, graph.getAllLinksBetween(graph.getNode(NODE_2), graph.getNode(NODE_1)).size()); assertEquals(2, graph.getAllLinksBetween(graph.getNode(NODE_1), graph.getNode(NODE_2)).size()); graph.addLink(NODE_2, NODE_1, CONNECTION_ID_2); assertEquals(2, graph.getAllLinksBetween(graph.getNode(NODE_2), graph.getNode(NODE_1)).size()); assertEquals(2, graph.getAllLinksBetween(graph.getNode(NODE_1), graph.getNode(NODE_2)).size()); } /** * Test for {@link TopologyMap#removeLink()}. */ public final void testRemoveChannel() { TopologyMap graph = new TopologyMap(NODE_2); graph.addNode(NODE_1); assertFalse(graph.containsLink(NODE_1, NODE_2, CONNECTION_ID_1)); graph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); graph.addLink(NODE_1, NODE_2, CONNECTION_ID_2); assertTrue(graph.containsLink(NODE_1, NODE_2, CONNECTION_ID_1)); assertFalse(graph.containsLink(NODE_1, NODE_2, CONNECTION_ID_3)); assertTrue(graph.removeLink(NODE_1, NODE_2, CONNECTION_ID_1)); assertFalse(graph.removeLink(NODE_1, NODE_2, CONNECTION_ID_1)); assertFalse(graph.containsLink(NODE_1, NODE_2, CONNECTION_ID_1)); assertTrue(graph.containsLink(NODE_1, NODE_2, CONNECTION_ID_2)); } /** * Test for {@link TopologyMap#removeNode()}. */ public final void testRemoveNode() { TopologyMap graph = new TopologyMap(NODE_2); graph.addNode(NODE_1); graph.removeNode(NODE_2); graph.removeNode((TopologyNode) null); assertTrue(graph.containsNode(NODE_1)); graph.removeNode(NODE_1); assertFalse(graph.containsNode(NODE_1)); } /** * Test for {@link TopologyMap#removeNode()}. */ public final void testRemoveNode2() { TopologyMap graph = new TopologyMap(NODE_2); graph.addNode(NODE_1); graph.addNode(NODE_3); graph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); graph.addLink(NODE_2, NODE_1, CONNECTION_ID_1); graph.addLink(NODE_2, NODE_3, CONNECTION_ID_1); graph.addLink(NODE_3, NODE_2, CONNECTION_ID_1); assertEquals(4, graph.getLinkCount()); graph.removeNode(NODE_1); graph.removeNode(new TopologyNode(NODE_1)); assertEquals(2, graph.getNodeCount()); assertEquals(2, graph.getLinkCount()); } /** * Tests for {@link TopologyNode#equals(Object)}. */ public final void testEqualNodes() { // should be equal assertEquals(new TopologyNode(NODE_1), new TopologyNode(NODE_1)); // should not be equal assertFalse((new TopologyNode(NODE_1)).equals(new TopologyNode(NODE_2))); } /** * Tests for {@link NetworkGraph#containsAnyChannel(NodeIdentifier, NodeIdentifier). */ public final void testContainsAnyChannel() { networkGraph = new TopologyMap(NODE_5); // TODO review this test; some of it seem redundant assertFalse(networkGraph.containsLinkBetween(null, null)); assertFalse(networkGraph.containsLinkBetween(NODE_5, null)); assertFalse(networkGraph.containsLinkBetween(NODE_1, null)); assertFalse(networkGraph.containsLinkBetween(null, NODE_5)); assertFalse(networkGraph.containsLinkBetween(null, NODE_1)); networkGraph.addLink(NODE_1, NODE_5, CONNECTION_ID_1); // TODO review: changed to assertTrue() after switch to connection ids; why was this // assertFalse() before? -- misc_ro assertTrue(networkGraph.containsLinkBetween(NODE_1, NODE_5)); networkGraph.addNode(NODE_1); assertTrue(networkGraph.containsLink(NODE_1, NODE_5, CONNECTION_ID_1)); assertFalse(networkGraph.containsLink(NODE_1, NODE_5, CONNECTION_ID_2)); } /** * Tests for {@link TopologyMap#containsNode(InstanceNodeSessionId)}. * * @throws IdentifierException on unexpected errors */ public final void testContainsNode() throws IdentifierException { networkGraph = new TopologyMap(NODE_5); assertTrue(networkGraph.containsNode(NODE_5)); assertFalse(networkGraph.containsNode(NODE_4)); // also test for different instance node session ids of the existing instance node ids assertFalse(networkGraph.containsNode(NodeIdentifierTestUtils.createTestInstanceNodeSessionId(NODE_5.getInstanceNodeIdString()))); assertFalse(networkGraph.containsNode(NodeIdentifierTestUtils.createTestInstanceNodeSessionId(NODE_4.getInstanceNodeIdString()))); // test with round-trip deserialized node id assertTrue(networkGraph.containsNode(NodeIdentifierTestUtils.getTestNodeIdentifierService().parseInstanceNodeSessionIdString( NODE_5.getInstanceNodeSessionIdString()))); } /** * Test for {@link TopologyMap#getShortestPath(InstanceNodeSessionId, InstanceNodeSessionId)}. */ public final void testShortestPathComputation1() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_3, CONNECTION_ID_1); networkGraph.addLink(NODE_3, NODE_1, CONNECTION_ID_1); NetworkRoute route = networkGraph.getShortestPath(NODE_1, NODE_3); assertEquals(2, route.getNodes().size()); assertEquals(NODE_2, route.getNodes().get(0)); assertEquals(NODE_3, route.getNodes().get(1)); assertEquals(route.getPath().size(), route.getNodes().size()); route = networkGraph.getShortestPath(NODE_1, NODE_2); assertEquals(1, route.getNodes().size()); assertEquals(NODE_2, route.getNodes().get(0)); } /** * Test for {@link TopologyMap#getNode(InstanceNodeSessionId)}. */ public final void testFindNetworkNode() { networkGraph = new TopologyMap(NODE_1); assertTrue(networkGraph.getNode(NODE_1) instanceof TopologyNode); assertNull(networkGraph.getNode(NODE_2)); } /** * Simple shortest path implementation. */ public final void testShortestPathComputation2() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_1, CONNECTION_ID_1); NetworkRoute route = networkGraph.getShortestPath(NODE_1, NODE_2); assertEquals(1, route.getNodes().size()); assertEquals(NODE_2, route.getNodes().get(0)); assertEquals(route.getPath().size(), route.getNodes().size()); route = networkGraph.getShortestPath(NODE_2, NODE_1); assertEquals(1, route.getNodes().size()); assertEquals(NODE_1, route.getNodes().get(0)); } /** * Simple shortest path implementation. */ public final void testShortestPathComputation3() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); networkGraph.addNode(NODE_4); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_2, NODE_3, CONNECTION_ID_1); networkGraph.addLink(NODE_3, NODE_4, CONNECTION_ID_1); NetworkRoute route = networkGraph.getShortestPath(NODE_1, NODE_4); assertEquals(3, route.getNodes().size()); assertEquals(NODE_2, route.getNodes().get(0)); assertEquals(NODE_3, route.getNodes().get(1)); assertEquals(NODE_4, route.getNodes().get(2)); networkGraph.addLink(NODE_2, NODE_4, CONNECTION_ID_1); route = networkGraph.getShortestPath(NODE_1, NODE_4); assertEquals(2, route.getNodes().size()); assertEquals(NODE_2, route.getNodes().get(0)); assertEquals(NODE_4, route.getNodes().get(1)); assertEquals(route.getPath().size(), route.getNodes().size()); route = networkGraph.getShortestPath(NODE_1, NODE_5); } /** * */ public final void testLinkStateAdvertisementProduction() { networkGraph = new TopologyMap(NODE_1); networkGraph.addNode(NODE_2); networkGraph.addNode(NODE_3); networkGraph.addNode(NODE_4); networkGraph.addLink(NODE_1, NODE_2, CONNECTION_ID_1); networkGraph.addLink(NODE_1, NODE_3, CONNECTION_ID_1); networkGraph.addLink(NODE_1, NODE_4, CONNECTION_ID_1); LinkStateAdvertisement lsa = networkGraph.generateNewLocalLSA(); assertTrue(lsa.getOwner().equals(networkGraph.getLocalNodeId())); assertEquals("Collection sizes are expected to be the same.", lsa.getLinks().size(), networkGraph.getSuccessors(NODE_1).size()); for (TopologyLink channel : lsa.getLinks()) { assertTrue(networkGraph.getPredecessors(networkGraph.getNode(channel.getDestination())) .contains(networkGraph.getNode(networkGraph.getLocalNodeId()))); } } /** * */ public final void testEquals() { TopologyMap graph1 = new TopologyMap(NODE_1); TopologyMap graph2 = new TopologyMap(NODE_2); assertFalse(graph1.equals(graph2)); graph1.addNode(NODE_2); assertFalse(graph1.equals(graph2)); graph2.addNode(NODE_1); assertTrue(graph1.equals(graph2)); graph1.addLink(NODE_1, NODE_2, CONNECTION_ID_1); assertFalse(graph1.equals(graph2)); graph2.addLink(NODE_1, NODE_2, CONNECTION_ID_1); assertTrue(graph1.equals(graph2)); } /** * @throws InterruptedException on interruption */ public final void testLinkStateUpdate() throws InterruptedException { TopologyMap graph1 = new TopologyMap(NODE_1); // cause timestamp-based sequence numbers to be different Thread.sleep(SHORT_TIMESTAMP_CHANGING_DELAY); TopologyMap graph2 = new TopologyMap(NODE_2); // crude approach to ensure different timestamps; it would be better to inject an artificial // time source for testing -- misc_ro, June 2013 while (graph2.getSequenceNumberOfNode(NODE_2) == graph1.getSequenceNumberOfNode(NODE_1)) { Thread.sleep(SHORT_TIMESTAMP_CHANGING_DELAY); graph2 = new TopologyMap(NODE_2); } // get the highest current sequence number (assuming node 3 was assigned the highest one) long node1OriginalSeqNo = graph1.getSequenceNumberOfNode(NODE_1); long node2OriginalSeqNo = graph2.getSequenceNumberOfNode(NODE_2); assertFalse(node1OriginalSeqNo == node2OriginalSeqNo); assertFalse(graph1.equals(graph2)); LinkStateAdvertisement lsa = graph1.generateNewLocalLSA(); // LSA generation should have increased the node 1 sequence number in graph 1 long node1NewSeqNo = graph1.getSequenceNumberOfNode(NODE_1); assertEquals(node1NewSeqNo, lsa.getSequenceNumber()); assertTrue(node1NewSeqNo > node1OriginalSeqNo); // verify graph update assertTrue(graph2.update(lsa)); assertEquals(node1NewSeqNo, graph2.getSequenceNumberOfNode(NODE_1)); lsa = graph2.generateNewLocalLSA(); // LSA generation should have increased the node 2 sequence number in graph 2 long node2NewSeqNo = graph2.getSequenceNumberOfNode(NODE_2); assertEquals(node2NewSeqNo, lsa.getSequenceNumber()); assertTrue(node2NewSeqNo > node2OriginalSeqNo); // verify graph update assertTrue(graph1.update(lsa)); assertEquals(node2NewSeqNo, graph1.getSequenceNumberOfNode(NODE_2)); assertTrue(graph1.equals(graph2)); graph1.addNode(NODE_3); graph1.addLink(NODE_1, NODE_3, CONNECTION_ID_1); assertFalse(graph1.equals(graph2)); lsa = graph1.generateNewLocalLSA(); assertTrue(lsa.getSequenceNumber() > node1NewSeqNo); node1NewSeqNo = graph1.getSequenceNumberOfNode(NODE_1); assertEquals(node1NewSeqNo, lsa.getSequenceNumber()); assertTrue(graph2.update(lsa)); assertEquals(node1NewSeqNo, graph2.getSequenceNumberOfNode(NODE_1)); assertTrue(graph1.equals(graph2)); graph2.addLink(NODE_2, NODE_1, CONNECTION_ID_1); assertFalse(graph2.equals(graph1)); lsa = graph2.generateNewLocalLSA(); graph1.update(lsa); node2NewSeqNo = graph2.getSequenceNumberOfNode(NODE_2); assertEquals(node2NewSeqNo, lsa.getSequenceNumber()); assertTrue(graph2.equals(graph1)); assertEquals(node1NewSeqNo, graph2.getSequenceNumberOfNode(NODE_1)); assertEquals(node2NewSeqNo, graph2.getSequenceNumberOfNode(NODE_2)); assertEquals(graph1.getSequenceNumberOfNode(NODE_3), graph2.getSequenceNumberOfNode(NODE_3)); // log.info(NetworkFormatter.summary(graph2)); // log.info(NetworkFormatter.summary(graph1)); } /** * Test for {@link NetworkGraph#getSuccessors())}. */ public final void testGetSuccessors() { TopologyMap graph1 = new TopologyMap(NODE_1); graph1.addNode(NODE_2); graph1.addNode(NODE_3); graph1.addNode(NODE_4); assertEquals(0, graph1.getSuccessors().size()); graph1.addLink(NODE_1, NODE_2, CONNECTION_ID_1); assertEquals(1, graph1.getSuccessors().size()); assertTrue(TopologyMap.toNodeIdentifiers(graph1.getSuccessors()).contains(NODE_2)); assertFalse(TopologyMap.toNodeIdentifiers(graph1.getSuccessors()).contains(NODE_1)); graph1.addLink(NODE_3, NODE_1, CONNECTION_ID_1); assertFalse(TopologyMap.toNodeIdentifiers(graph1.getSuccessors()).contains(NODE_3)); assertTrue(TopologyMap.toNodeIdentifiers(graph1.getSuccessors()).contains(NODE_2)); } }