in maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java [373:424]
private RunResult runSuitesForkPerTestSet(SurefireProperties effectiveSystemProps, int forkCount)
throws SurefireBooterForkException {
TestLessInputStreamBuilder builder = new TestLessInputStreamBuilder();
Thread shutdown = createCachableShutdownHookThread(builder, providerConfiguration.getShutdown());
ThreadPoolExecutor executor =
new ThreadPoolExecutor(forkCount, forkCount, 60, SECONDS, new LinkedBlockingQueue<>());
executor.setThreadFactory(FORKED_JVM_DAEMON_THREAD_FACTORY);
ScheduledFuture<?> ping = triggerPingTimerForShutdown(builder);
try {
addShutDownHook(shutdown);
int failFastCount = providerConfiguration.getSkipAfterFailureCount();
AtomicInteger notifyForksToSkipTestsNow = new AtomicInteger(failFastCount);
Collection<Future<RunResult>> results = stream(((Iterable<?>) getSuitesIterator()).spliterator(), false)
.filter(fork -> !forkConfiguration.getPluginPlatform().isShutdown())
.map(testSet -> (Callable<RunResult>) () -> {
int forkNumber = drawNumber();
DefaultReporterFactory forkedReporterFactory =
new DefaultReporterFactory(startupReportConfiguration, log, forkNumber);
defaultReporterFactories.add(forkedReporterFactory);
TestLessInputStream stream = builder.build();
ForkClient forkClient = new ForkClient(forkedReporterFactory, stream, forkNumber);
NotifiableTestStream notifiable = builder.getCachableCommands();
forkClient.setStopOnNextTestListener(
() -> runIfZeroCountDown(notifiable::skipSinceNextTest, notifyForksToSkipTestsNow));
Map<String, String> providerProperties = providerConfiguration.getProviderProperties();
PropertiesWrapper keyValues = new PropertiesWrapper(providerProperties);
ForkNodeFactory node = forkConfiguration.getForkNodeFactory();
try {
return fork(
testSet,
keyValues,
forkClient,
effectiveSystemProps,
forkNumber,
stream,
node,
false);
} finally {
returnNumber(forkNumber);
builder.removeStream(stream);
}
})
.map(executor::submit)
.collect(toList());
return awaitResultsDone(results, executor);
} finally {
removeShutdownHook(shutdown);
ping.cancel(true);
closeExecutor(executor);
}
}