package io.divolte.server; import org.junit.runners.Parameterized; import org.junit.runners.model.RunnerScheduler; import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @ParametersAreNonnullByDefault public class ConcurrentParameterized extends Parameterized { // This happens to the maximum number of tests we can run in parallel with Sauce Labs. private static final int MAXIMUM_CONCURRENCY = 5; public ConcurrentParameterized(final Class<?> cls) throws Throwable { super(cls); setScheduler(new ConcurrentRunner()); } private static class ConcurrentRunner implements RunnerScheduler { private final ExecutorService executorService = Executors.newFixedThreadPool(MAXIMUM_CONCURRENCY); public void schedule(final Runnable childStatement) { executorService.submit(childStatement); } public void finished() { // Only stops new tasks being submitted; doesn't abort. executorService.shutdown(); // Wait for everything submitted to complete. try { executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); } catch (final InterruptedException e) { // Preserve interrupted status. Thread.currentThread().interrupt(); } } } }