/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.testutils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.TimeoutException;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.Timeout;
import de.rcenvironment.core.communication.common.NetworkGraph;
import de.rcenvironment.core.communication.routing.internal.NetworkFormatter;
import de.rcenvironment.core.communication.transport.virtual.testutils.VirtualInstanceTestUtils;
import de.rcenvironment.core.communication.transport.virtual.testutils.VirtualTopology;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Common base class for {@link VirtualInstance} tests.
*
* @author Robert Mischke
*/
public abstract class AbstractVirtualInstanceTest extends AbstractTransportBasedTest {
protected static final String ERROR_MSG_NUMBER_OF_NODES = "Unexpected number of nodes in topology: ";
protected static final String ERROR_MSG_NUMBER_OF_LINKS = "Unexpected number of links in topology: ";
protected static final String ERROR_MSG_INSTANCES_DID_NOT_CONVERGE = "Instances did not converge";
protected static final String ERROR_MSG_A_NO_ROUTE_TO_B = "%s could not find a route to %s";
protected static int testSize;
/**
* This sets a conservative timeout for all derived tests; individual test may set stricter timeouts. - misc_ro
*/
@Rule
public Timeout globalTimeout = new Timeout(DEFAULT_SAFEGUARD_TEST_TIMEOUT);
protected VirtualInstanceTestUtils instanceUtils;
protected VirtualInstance[] allInstances;
protected VirtualTopology testTopology;
private final TestNetworkTrafficListener trafficListener = new TestNetworkTrafficListener();
/**
* Common setup method; sets up instanceUtils.
*
* @throws Exception on uncaught exceptions
*/
@Before
public void setUp() throws Exception {
instanceUtils = new VirtualInstanceTestUtils(transportProvider, contactPointGenerator);
}
/**
* Common teardown method; logs traffic statistics and resets static flags.
*
* @throws Exception on uncaught exceptions
*/
@After
public void tearDown() throws Exception {
// log statistics
if (allInstances != null) {
log.info(getGlobalTrafficListener().getFormattedTrafficReport(testSize));
}
// reset static flags in case they were changed
VirtualInstance.setRememberRuntimePeersAfterRestarts(false);
}
protected void setupInstances(int numNodes, boolean useDuplexTransport, boolean startInstances) throws InterruptedException {
log.debug(StringUtils.format("Setting up test '%s' with topology size %d", getCurrentTestName(), numNodes));
allInstances = instanceUtils.spawnDefaultInstances(numNodes, useDuplexTransport, startInstances);
addGlobalTrafficListener(allInstances);
testTopology = new VirtualTopology(allInstances);
testSize = numNodes;
}
protected void assertAllInstancesKnowSameTopology() {
assertInstancesKnowSameTopology(allInstances);
}
protected void assertInstancesKnowSameTopology(VirtualInstance[] instances) {
assertTrue(ERROR_MSG_INSTANCES_DID_NOT_CONVERGE, instanceUtils.allInstancesHaveSameRawNetworkGraph(instances));
}
protected boolean instancesHaveSameUnfilteredNetworkGraph(VirtualInstance vi1, VirtualInstance vi2) {
// TODO merge with similar "assert" method?
return vi1.getRawNetworkGraph().getCompactRepresentation().equals(vi2.getRawNetworkGraph().getCompactRepresentation());
}
protected void addGlobalTrafficListener(VirtualInstance[] instances) {
// wrap & delegate
addGlobalTrafficListener(new VirtualInstanceGroup(instances));
}
protected void addGlobalTrafficListener(VirtualInstanceGroup group) {
group.addNetworkTrafficListener(trafficListener);
}
protected void prepareWaitForNextMessage() {
trafficListener.clearCustomTrafficFlag();
}
protected void waitForNextMessage() throws TimeoutException, InterruptedException {
trafficListener.waitForCustomTrafficFlag(testConfiguration.getDefaultTrafficWaitTimeout());
}
protected void waitForNetworkSilence() throws TimeoutException, InterruptedException {
trafficListener.waitForNetworkSilence(testConfiguration.getDefaultNetworkSilenceWait(),
testConfiguration.getDefaultNetworkSilenceWaitTimeout());
}
protected void waitForNetworkSilence(int timeoutMsec) throws TimeoutException, InterruptedException {
trafficListener.waitForNetworkSilence(testConfiguration.getDefaultNetworkSilenceWait(), timeoutMsec);
}
protected TestNetworkTrafficListener getGlobalTrafficListener() {
return trafficListener;
}
protected void assertNodeAndLinkCount(VirtualInstance vi, int expectedNodeCount, int expectedLinkCount) {
NetworkGraph rawNetworkGraph = vi.getRawNetworkGraph();
try {
assertEquals(ERROR_MSG_NUMBER_OF_NODES, expectedNodeCount, rawNetworkGraph.getNodeCount());
assertEquals(ERROR_MSG_NUMBER_OF_LINKS, expectedLinkCount, rawNetworkGraph.getLinkCount());
} catch (AssertionError e) {
log.debug(NetworkFormatter.networkGraphToGraphviz(rawNetworkGraph, false));
log.debug(vi.getFormattedLSAKnowledge());
throw e;
}
}
}