package mil.nga.giat.geowave.test; import java.lang.reflect.Method; import java.util.Collections; import java.util.List; import org.junit.internal.runners.statements.RunAfters; import org.junit.runner.Runner; import org.junit.runner.notification.RunNotifier; import org.junit.runners.Suite; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.InitializationError; import org.junit.runners.model.RunnerBuilder; import org.junit.runners.model.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class GeoWaveITSuiteRunner extends Suite { private static final Logger LOGGER = LoggerFactory.getLogger(GeoWaveITSuiteRunner.class); @Override protected Statement withAfterClasses( Statement statement ) { try { Statement newStatement = super.withAfterClasses(statement); final Method tearDownMethod = GeoWaveITSuiteRunner.class.getDeclaredMethod("tearDown"); tearDownMethod.setAccessible(true); return new RunAfters( newStatement, Collections.singletonList(new FrameworkMethod( tearDownMethod)), this); } catch (NoSuchMethodException | SecurityException e) { LOGGER.warn( "Unable to find tearDown method", e); } return super.withAfterClasses(statement); } private GeoWaveITRunner itRunner; protected void tearDown() throws Exception { if (itRunner != null) { itRunner.tearDown(); } } @Override protected void runChild( Runner runner, RunNotifier notifier ) { // this is kinda a hack but the intent is to ensure that each individual // test is able to tear down the environment *after* the // suite.tearDown() method is called, in general the child runner // methods are always called before the parent runner if (runner instanceof GeoWaveITRunner) { itRunner = (GeoWaveITRunner) runner; } super.runChild( runner, notifier); } public GeoWaveITSuiteRunner( final Class<?> klass, final List<Runner> runners ) throws InitializationError { super( klass, runners); } public GeoWaveITSuiteRunner( final Class<?> klass, final RunnerBuilder builder ) throws InitializationError { super( klass, builder); } public GeoWaveITSuiteRunner( final RunnerBuilder builder, final Class<?> klass, final Class<?>[] suiteClasses ) throws InitializationError { super( builder, klass, suiteClasses); } public GeoWaveITSuiteRunner( final RunnerBuilder builder, final Class<?>[] classes ) throws InitializationError { super( builder, classes); } protected GeoWaveITSuiteRunner( final Class<?> klass, final Class<?>[] suiteClasses ) throws InitializationError { super( klass, suiteClasses); } }