/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.api; import static org.easymock.EasyMock.capture; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Set; import org.easymock.Capture; import org.easymock.EasyMock; import org.junit.Test; import de.rcenvironment.core.communication.common.NetworkGraph; import de.rcenvironment.core.communication.common.InstanceNodeSessionId; import de.rcenvironment.core.communication.routing.NetworkRoutingService; import de.rcenvironment.core.communication.routing.internal.NetworkRoutingServiceImpl; import de.rcenvironment.core.communication.spi.NetworkTopologyChangeListener; import de.rcenvironment.core.communication.testutils.AbstractVirtualInstanceTest; import de.rcenvironment.core.communication.testutils.TestConfiguration; import de.rcenvironment.core.communication.testutils.VirtualCommunicationBundle; import de.rcenvironment.core.communication.testutils.VirtualInstance; import de.rcenvironment.core.communication.transport.virtual.VirtualTransportTestConfiguration; /** * Integration tests for events related to network topology changes. * * @author Robert Mischke */ public class TopologyChangeEventsIntegrationTest extends AbstractVirtualInstanceTest { private static final int WAIT_FOR_ASYNC_EVENT_MSEC = 100; @Override protected TestConfiguration defineTestConfiguration() { return new VirtualTransportTestConfiguration(true); } /** * Tests proper callbacks to registered {@link NetworkTopologyChangeListener}s. * * @throws Exception on uncaught exceptions */ @Test public void testNetworkTopologyChangeListeners() throws Exception { setupInstances(3, true, false); final VirtualInstance initialNode = testTopology.getInstance(0); initialNode.start(); final VirtualCommunicationBundle communicationBundle = initialNode.getVirtualCommunicationBundle(); final NetworkRoutingServiceImpl networkRoutingService = (NetworkRoutingServiceImpl) communicationBundle.getService(NetworkRoutingService.class); Capture<Set<InstanceNodeSessionId>> reachableNodesCapture = new Capture<Set<InstanceNodeSessionId>>(); Capture<Set<InstanceNodeSessionId>> addedNodesCapture = new Capture<Set<InstanceNodeSessionId>>(); Capture<Set<InstanceNodeSessionId>> removedNodesCapture = new Capture<Set<InstanceNodeSessionId>>(); final NetworkTopologyChangeListener topologyChangeListener = EasyMock.createMock(NetworkTopologyChangeListener.class); // set expectation on subscription topologyChangeListener.onReachableNodesChanged(capture(reachableNodesCapture), capture(addedNodesCapture), capture(removedNodesCapture)); topologyChangeListener.onReachableNetworkChanged(EasyMock.anyObject(NetworkGraph.class)); // execute EasyMock.replay(topologyChangeListener); networkRoutingService.addNetworkTopologyChangeListener(topologyChangeListener); Thread.sleep(WAIT_FOR_ASYNC_EVENT_MSEC); EasyMock.verify(topologyChangeListener); // check callback parameters assertEquals(1, reachableNodesCapture.getValue().size()); assertTrue(reachableNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertEquals(1, addedNodesCapture.getValue().size()); assertTrue(addedNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertEquals(0, removedNodesCapture.getValue().size()); // define expectation on new reachable node EasyMock.reset(topologyChangeListener); topologyChangeListener.onNetworkTopologyChanged(); EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNetworkChanged(EasyMock.anyObject(NetworkGraph.class)); // TODO check parameter? EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNodesChanged(capture(reachableNodesCapture), capture(addedNodesCapture), capture(removedNodesCapture)); // execute EasyMock.replay(topologyChangeListener); final VirtualInstance addedNode1 = testTopology.getInstance(1); addedNode1.start(); prepareWaitForNextMessage(); testTopology.connect(0, 1, true); waitForNextMessage(); waitForNetworkSilence(); EasyMock.verify(topologyChangeListener); // check callback parameters assertEquals(2, reachableNodesCapture.getValue().size()); assertTrue(reachableNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertTrue(reachableNodesCapture.getValue().contains(addedNode1.getInstanceNodeSessionId())); assertEquals(1, addedNodesCapture.getValue().size()); assertTrue(addedNodesCapture.getValue().contains(addedNode1.getInstanceNodeSessionId())); assertEquals(0, removedNodesCapture.getValue().size()); // define expectation on 2nd new reachable node EasyMock.reset(topologyChangeListener); topologyChangeListener.onNetworkTopologyChanged(); EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNetworkChanged(EasyMock.anyObject(NetworkGraph.class)); // TODO check parameter? EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNodesChanged(capture(reachableNodesCapture), capture(addedNodesCapture), capture(removedNodesCapture)); // execute EasyMock.replay(topologyChangeListener); final VirtualInstance addedNode2 = testTopology.getInstance(2); addedNode2.start(); prepareWaitForNextMessage(); testTopology.connect(0, 2, true); waitForNextMessage(); waitForNetworkSilence(); EasyMock.verify(topologyChangeListener); // check callback parameters assertEquals(3, reachableNodesCapture.getValue().size()); assertTrue(reachableNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertTrue(reachableNodesCapture.getValue().contains(addedNode1.getInstanceNodeSessionId())); assertTrue(reachableNodesCapture.getValue().contains(addedNode2.getInstanceNodeSessionId())); assertEquals(1, addedNodesCapture.getValue().size()); assertTrue(addedNodesCapture.getValue().contains(addedNode2.getInstanceNodeSessionId())); assertEquals(0, removedNodesCapture.getValue().size()); // define expectation on shutting down the first added node EasyMock.reset(topologyChangeListener); topologyChangeListener.onNetworkTopologyChanged(); EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNetworkChanged(EasyMock.anyObject(NetworkGraph.class)); // TODO check parameter? EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNodesChanged(capture(reachableNodesCapture), capture(addedNodesCapture), capture(removedNodesCapture)); // execute EasyMock.replay(topologyChangeListener); prepareWaitForNextMessage(); addedNode1.shutDown(); waitForNextMessage(); waitForNetworkSilence(); EasyMock.verify(topologyChangeListener); // check callback parameters assertEquals(2, reachableNodesCapture.getValue().size()); assertTrue(reachableNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertTrue(reachableNodesCapture.getValue().contains(addedNode2.getInstanceNodeSessionId())); assertEquals(0, addedNodesCapture.getValue().size()); assertEquals(1, removedNodesCapture.getValue().size()); assertTrue(removedNodesCapture.getValue().contains(addedNode1.getInstanceNodeSessionId())); // define expectation on shutting down the second added node EasyMock.reset(topologyChangeListener); topologyChangeListener.onNetworkTopologyChanged(); EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNetworkChanged(EasyMock.anyObject(NetworkGraph.class)); // TODO check parameter? EasyMock.expectLastCall().atLeastOnce(); topologyChangeListener.onReachableNodesChanged(capture(reachableNodesCapture), capture(addedNodesCapture), capture(removedNodesCapture)); // execute EasyMock.replay(topologyChangeListener); prepareWaitForNextMessage(); addedNode2.shutDown(); waitForNextMessage(); waitForNetworkSilence(); EasyMock.verify(topologyChangeListener); // check callback parameters assertEquals(1, reachableNodesCapture.getValue().size()); assertTrue(reachableNodesCapture.getValue().contains(initialNode.getInstanceNodeSessionId())); assertEquals(0, addedNodesCapture.getValue().size()); assertEquals(1, removedNodesCapture.getValue().size()); assertTrue(removedNodesCapture.getValue().contains(addedNode2.getInstanceNodeSessionId())); } }