private RunResult runSuitesForkPerTestSet()

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);
        }
    }