/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.testutils; import java.util.Random; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.rules.TestName; import de.rcenvironment.core.communication.transport.spi.NetworkTransportProvider; import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils; import de.rcenvironment.core.utils.common.StringUtils; /** * Base class for JUnit tests related to {@link NetworkTransportProvider} behavior. This includes low-level tests as well as higher-level * {@link VirtualInstance} tests. * * @author Robert Mischke */ public abstract class AbstractTransportBasedTest { protected static final int DEFAULT_SAFEGUARD_TEST_TIMEOUT = 60000; protected static final int DEFAULT_NODE_REACHABILITY_TIMEOUT = 2000; private static final double NANOS_PER_SEC = 1e9; /** * JUnit {@link Rule} to acquire the running test's name in JUnit 4. */ @Rule public final TestName name = new TestName(); protected final Random randomGenerator = new Random(); protected final Log log = LogFactory.getLog(getClass()); protected TestConfiguration testConfiguration; protected NetworkTransportProvider transportProvider; protected NetworkContactPointGenerator contactPointGenerator; protected boolean usingDuplexTransport = false; private long startTimeNano; /** * Setup method to apply the settings defined in {@link #defineTestConfiguration()}. */ @Before public void applyInjectedConfiguration() { testConfiguration = defineTestConfiguration(); transportProvider = testConfiguration.getTransportProvider(); contactPointGenerator = testConfiguration.getContactPointGenerator(); usingDuplexTransport = transportProvider.supportsRemoteInitiatedConnections(); Assert.assertTrue(testConfiguration.getDefaultTrafficWaitTimeout() > 0); Assert.assertTrue(testConfiguration.getDefaultNetworkSilenceWait() > 0); Assert.assertTrue(testConfiguration.getDefaultNetworkSilenceWaitTimeout() > 0); } /** * Common test setup; prepares time measurement. */ @Before public void commonTestStart() { startTimeNano = System.nanoTime(); } /** * Common test tear-down; prints test name, duration, and thread pool statistics. */ @After public void commonTestEnd() { // get execution time double testDuration = (System.nanoTime() - startTimeNano) / NANOS_PER_SEC; // get thread statistics int threadPoolSize = ConcurrencyUtils.getThreadPoolManagement().getCurrentThreadCount(); int threadCount = Thread.activeCount(); // clear thread pool int queuedCount = ConcurrencyUtils.getThreadPoolManagement().reset(); if (queuedCount != 0) { log.warn("When resetting the thread pool, " + queuedCount + " Runnables were still queued"); } // log summary log.debug(StringUtils.format("End of test '%s'; Duration: %.3f sec; Communication thread pool size: %d; Global thread count: %d", getCurrentTestName(), testDuration, threadPoolSize, threadCount)); } protected abstract TestConfiguration defineTestConfiguration(); protected String getCurrentTestName() { return name.getMethodName(); } }