Skip to content

Commit 3ed8f0f

Browse files
committed
Revert "Introduce configuration parameter for opting in to new implementation"
This reverts commit 9d77839.
1 parent b3b1345 commit 3ed8f0f

File tree

9 files changed

+15
-113
lines changed

9 files changed

+15
-113
lines changed

documentation/src/test/resources/junit-platform.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
junit.jupiter.execution.parallel.enabled=true
2-
junit.jupiter.execution.parallel.executor=org.junit.platform.engine.support.hierarchical.ConcurrentHierarchicalTestExecutorService
32
junit.jupiter.execution.parallel.mode.default=concurrent
43
junit.jupiter.execution.parallel.config.strategy=fixed
54
junit.jupiter.execution.parallel.config.fixed.parallelism=6

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/Constants.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
1414
import static org.apiguardian.api.API.Status.MAINTAINED;
1515
import static org.apiguardian.api.API.Status.STABLE;
16-
import static org.junit.jupiter.engine.config.JupiterConfiguration.PARALLEL_CONFIG_PREFIX;
1716
import static org.junit.platform.engine.support.hierarchical.DefaultParallelExecutionConfigurationStrategy.CONFIG_CUSTOM_CLASS_PROPERTY_NAME;
1817
import static org.junit.platform.engine.support.hierarchical.DefaultParallelExecutionConfigurationStrategy.CONFIG_DYNAMIC_FACTOR_PROPERTY_NAME;
1918
import static org.junit.platform.engine.support.hierarchical.DefaultParallelExecutionConfigurationStrategy.CONFIG_FIXED_MAX_POOL_SIZE_PROPERTY_NAME;
@@ -39,8 +38,6 @@
3938
import org.junit.jupiter.api.parallel.Execution;
4039
import org.junit.jupiter.engine.config.JupiterConfiguration;
4140
import org.junit.platform.commons.util.ClassNamePatternFilterUtils;
42-
import org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService;
43-
import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService;
4441
import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfigurationStrategy;
4542

4643
/**
@@ -213,21 +210,6 @@ public final class Constants {
213210
@API(status = STABLE, since = "5.10")
214211
public static final String PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME = JupiterConfiguration.PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME;
215212

216-
/**
217-
* Property name used to configure the fully qualified class name
218-
* {@link HierarchicalTestExecutorService} implementation to use if parallel
219-
* test execution is
220-
* {@linkplain #PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME enabled}: {@value}
221-
*
222-
* <p>The implementation class must provide a parameter of type
223-
*
224-
* <p>By default, {@link ForkJoinPoolHierarchicalTestExecutorService} is used.
225-
*
226-
* @since 6.1
227-
*/
228-
@API(status = EXPERIMENTAL, since = "6.1")
229-
public static final String PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME = JupiterConfiguration.PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME;
230-
231213
/**
232214
* Property name used to enable auto-closing of {@link AutoCloseable} instances
233215
*
@@ -255,6 +237,8 @@ public final class Constants {
255237
@API(status = STABLE, since = "5.10")
256238
public static final String DEFAULT_CLASSES_EXECUTION_MODE_PROPERTY_NAME = Execution.DEFAULT_CLASSES_EXECUTION_MODE_PROPERTY_NAME;
257239

240+
static final String PARALLEL_CONFIG_PREFIX = "junit.jupiter.execution.parallel.config.";
241+
258242
/**
259243
* Property name used to select the
260244
* {@link ParallelExecutionConfigurationStrategy}: {@value}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/JupiterTestEngine.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import org.junit.platform.engine.ExecutionRequest;
2828
import org.junit.platform.engine.TestDescriptor;
2929
import org.junit.platform.engine.UniqueId;
30+
import org.junit.platform.engine.support.config.PrefixedConfigurationParameters;
3031
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
32+
import org.junit.platform.engine.support.hierarchical.ConcurrentHierarchicalTestExecutorService;
3133
import org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine;
3234
import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService;
3335
import org.junit.platform.engine.support.hierarchical.ThrowableCollector;
@@ -77,7 +79,8 @@ public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId
7779
protected HierarchicalTestExecutorService createExecutorService(ExecutionRequest request) {
7880
JupiterConfiguration configuration = getJupiterConfiguration(request);
7981
if (configuration.isParallelExecutionEnabled()) {
80-
return configuration.createParallelExecutorService();
82+
return new ConcurrentHierarchicalTestExecutorService(new PrefixedConfigurationParameters(
83+
request.getConfigurationParameters(), Constants.PARALLEL_CONFIG_PREFIX));
8184
}
8285
return super.createExecutorService(request);
8386
}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.junit.jupiter.api.io.TempDirFactory;
3333
import org.junit.jupiter.api.parallel.ExecutionMode;
3434
import org.junit.platform.engine.OutputDirectoryCreator;
35-
import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService;
3635

3736
/**
3837
* Caching implementation of the {@link JupiterConfiguration} API.
@@ -70,11 +69,6 @@ public boolean isParallelExecutionEnabled() {
7069
__ -> delegate.isParallelExecutionEnabled());
7170
}
7271

73-
@Override
74-
public HierarchicalTestExecutorService createParallelExecutorService() {
75-
return delegate.createParallelExecutorService();
76-
}
77-
7872
@Override
7973
public boolean isClosingStoredAutoCloseablesEnabled() {
8074
return (boolean) cache.computeIfAbsent(CLOSING_STORED_AUTO_CLOSEABLE_ENABLED_PROPERTY_NAME,

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,13 @@
3434
import org.junit.jupiter.api.io.CleanupMode;
3535
import org.junit.jupiter.api.io.TempDirFactory;
3636
import org.junit.jupiter.api.parallel.ExecutionMode;
37-
import org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter.Strictness;
3837
import org.junit.platform.commons.util.ClassNamePatternFilterUtils;
3938
import org.junit.platform.commons.util.Preconditions;
4039
import org.junit.platform.engine.ConfigurationParameters;
4140
import org.junit.platform.engine.DiscoveryIssue;
4241
import org.junit.platform.engine.DiscoveryIssue.Severity;
4342
import org.junit.platform.engine.OutputDirectoryCreator;
44-
import org.junit.platform.engine.support.config.PrefixedConfigurationParameters;
4543
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
46-
import org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService;
47-
import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService;
4844

4945
/**
5046
* Default implementation of the {@link JupiterConfiguration} API.
@@ -85,10 +81,6 @@ public class DefaultJupiterConfiguration implements JupiterConfiguration {
8581
private static final ConfigurationParameterConverter<ExtensionContextScope> extensionContextScopeConverter = //
8682
new EnumConfigurationParameterConverter<>(ExtensionContextScope.class, "extension context scope");
8783

88-
private static final ConfigurationParameterConverter<HierarchicalTestExecutorService> parallelExecutorServiceConverter = //
89-
new InstantiatingConfigurationParameterConverter<>(HierarchicalTestExecutorService.class,
90-
"parallel executor service", Strictness.FAIL, parameters -> new Object[] { parallelConfig(parameters) });
91-
9284
private final ConfigurationParameters configurationParameters;
9385
private final OutputDirectoryCreator outputDirectoryCreator;
9486

@@ -144,13 +136,6 @@ public boolean isParallelExecutionEnabled() {
144136
return configurationParameters.getBoolean(PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME).orElse(false);
145137
}
146138

147-
@Override
148-
public HierarchicalTestExecutorService createParallelExecutorService() {
149-
return parallelExecutorServiceConverter.get(configurationParameters, PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME) //
150-
.orElseGet(
151-
() -> new ForkJoinPoolHierarchicalTestExecutorService(parallelConfig(configurationParameters)));
152-
}
153-
154139
@Override
155140
public boolean isClosingStoredAutoCloseablesEnabled() {
156141
return configurationParameters.getBoolean(CLOSING_STORED_AUTO_CLOSEABLE_ENABLED_PROPERTY_NAME).orElse(true);
@@ -229,9 +214,4 @@ public ExtensionContextScope getDefaultTestInstantiationExtensionContextScope()
229214
public OutputDirectoryCreator getOutputDirectoryCreator() {
230215
return outputDirectoryCreator;
231216
}
232-
233-
private static PrefixedConfigurationParameters parallelConfig(ConfigurationParameters configurationParameters) {
234-
return new PrefixedConfigurationParameters(configurationParameters, PARALLEL_CONFIG_PREFIX);
235-
}
236-
237217
}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/InstantiatingConfigurationParameterConverter.java

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,28 @@
1010

1111
package org.junit.jupiter.engine.config;
1212

13-
import java.lang.reflect.Constructor;
1413
import java.util.Optional;
15-
import java.util.function.Function;
1614
import java.util.function.Supplier;
17-
import java.util.stream.IntStream;
1815

19-
import org.junit.platform.commons.JUnitException;
2016
import org.junit.platform.commons.function.Try;
2117
import org.junit.platform.commons.logging.Logger;
2218
import org.junit.platform.commons.logging.LoggerFactory;
2319
import org.junit.platform.commons.support.ReflectionSupport;
24-
import org.junit.platform.commons.util.Preconditions;
25-
import org.junit.platform.commons.util.ReflectionUtils;
2620
import org.junit.platform.engine.ConfigurationParameters;
2721

2822
/**
2923
* @since 5.5
3024
*/
31-
final class InstantiatingConfigurationParameterConverter<T> implements ConfigurationParameterConverter<T> {
25+
class InstantiatingConfigurationParameterConverter<T> implements ConfigurationParameterConverter<T> {
3226

3327
private static final Logger logger = LoggerFactory.getLogger(InstantiatingConfigurationParameterConverter.class);
3428

3529
private final Class<T> clazz;
3630
private final String name;
37-
private final Strictness strictness;
38-
private final Function<ConfigurationParameters, Object[]> argumentResolver;
3931

4032
InstantiatingConfigurationParameterConverter(Class<T> clazz, String name) {
41-
this(clazz, name, Strictness.WARN, __ -> new Object[0]);
42-
}
43-
44-
InstantiatingConfigurationParameterConverter(Class<T> clazz, String name, Strictness strictness,
45-
Function<ConfigurationParameters, Object[]> argumentResolver) {
4633
this.clazz = clazz;
4734
this.name = name;
48-
this.strictness = strictness;
49-
this.argumentResolver = argumentResolver;
5035
}
5136

5237
@Override
@@ -59,62 +44,31 @@ Supplier<Optional<T>> supply(ConfigurationParameters configurationParameters, St
5944
return configurationParameters.get(key)
6045
.map(String::strip)
6146
.filter(className -> !className.isEmpty())
62-
.map(className -> newInstanceSupplier(className, key, configurationParameters))
47+
.map(className -> newInstanceSupplier(className, key))
6348
.orElse(Optional::empty);
6449
// @formatter:on
6550
}
6651

67-
private Supplier<Optional<T>> newInstanceSupplier(String className, String key,
68-
ConfigurationParameters configurationParameters) {
52+
private Supplier<Optional<T>> newInstanceSupplier(String className, String key) {
6953
Try<Class<?>> clazz = ReflectionSupport.tryToLoadClass(className);
7054
// @formatter:off
71-
return () -> clazz.andThenTry(it -> instantiate(it, configurationParameters))
55+
return () -> clazz.andThenTry(ReflectionSupport::newInstance)
7256
.andThenTry(this.clazz::cast)
7357
.ifSuccess(generator -> logSuccessMessage(className, key))
7458
.ifFailure(cause -> logFailureMessage(className, key, cause))
7559
.toOptional();
7660
// @formatter:on
7761
}
7862

79-
@SuppressWarnings("unchecked")
80-
private <V> V instantiate(Class<V> clazz, ConfigurationParameters configurationParameters) {
81-
var arguments = argumentResolver.apply(configurationParameters);
82-
if (arguments.length == 0) {
83-
return ReflectionSupport.newInstance(clazz);
84-
}
85-
var constructors = ReflectionUtils.findConstructors(clazz, it -> {
86-
if (it.getParameterCount() != arguments.length) {
87-
return false;
88-
}
89-
var parameters = it.getParameters();
90-
return IntStream.range(0, parameters.length) //
91-
.allMatch(i -> parameters[i].getType().isAssignableFrom(arguments[i].getClass()));
92-
});
93-
Preconditions.condition(constructors.size() == 1,
94-
() -> "Failed to find unambiguous constructor for %s. Candidates: %s".formatted(clazz.getName(),
95-
constructors));
96-
return ReflectionUtils.newInstance((Constructor<V>) constructors.get(0), arguments);
97-
}
98-
9963
private void logFailureMessage(String className, String key, Exception cause) {
100-
switch (strictness) {
101-
case WARN -> logger.warn(cause, () -> """
102-
Failed to load default %s class '%s' set via the '%s' configuration parameter. \
103-
Falling back to default behavior.""".formatted(this.name, className, key));
104-
case FAIL -> throw new JUnitException(
105-
"Failed to load default %s class '%s' set via the '%s' configuration parameter.".formatted(this.name,
106-
className, key),
107-
cause);
108-
}
64+
logger.warn(cause, () -> """
65+
Failed to load default %s class '%s' set via the '%s' configuration parameter. \
66+
Falling back to default behavior.""".formatted(this.name, className, key));
10967
}
11068

11169
private void logSuccessMessage(String className, String key) {
11270
logger.config(() -> "Using default %s '%s' set via the '%s' configuration parameter.".formatted(this.name,
11371
className, key));
11472
}
11573

116-
enum Strictness {
117-
FAIL, WARN
118-
}
119-
12074
}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.junit.jupiter.api.parallel.Execution;
3232
import org.junit.jupiter.api.parallel.ExecutionMode;
3333
import org.junit.platform.engine.OutputDirectoryCreator;
34-
import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService;
3534

3635
/**
3736
* @since 5.4
@@ -43,8 +42,6 @@ public interface JupiterConfiguration {
4342
String EXTENSIONS_AUTODETECTION_EXCLUDE_PROPERTY_NAME = "junit.jupiter.extensions.autodetection.exclude";
4443
String DEACTIVATE_CONDITIONS_PATTERN_PROPERTY_NAME = "junit.jupiter.conditions.deactivate";
4544
String PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME = "junit.jupiter.execution.parallel.enabled";
46-
String PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME = "junit.jupiter.execution.parallel.executor";
47-
String PARALLEL_CONFIG_PREFIX = "junit.jupiter.execution.parallel.config.";
4845
String CLOSING_STORED_AUTO_CLOSEABLE_ENABLED_PROPERTY_NAME = "junit.jupiter.extensions.store.close.autocloseable.enabled";
4946
String DEFAULT_EXECUTION_MODE_PROPERTY_NAME = Execution.DEFAULT_EXECUTION_MODE_PROPERTY_NAME;
5047
String DEFAULT_CLASSES_EXECUTION_MODE_PROPERTY_NAME = Execution.DEFAULT_CLASSES_EXECUTION_MODE_PROPERTY_NAME;
@@ -64,8 +61,6 @@ public interface JupiterConfiguration {
6461

6562
boolean isParallelExecutionEnabled();
6663

67-
HierarchicalTestExecutorService createParallelExecutorService();
68-
6964
boolean isClosingStoredAutoCloseablesEnabled();
7065

7166
boolean isExtensionAutoDetectionEnabled();

platform-tests/src/test/java/org/junit/platform/engine/support/hierarchical/ParallelExecutionIntegrationTests.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import static org.junit.jupiter.engine.Constants.PARALLEL_CONFIG_FIXED_PARALLELISM_PROPERTY_NAME;
2626
import static org.junit.jupiter.engine.Constants.PARALLEL_CONFIG_STRATEGY_PROPERTY_NAME;
2727
import static org.junit.jupiter.engine.Constants.PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME;
28-
import static org.junit.jupiter.engine.Constants.PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME;
2928
import static org.junit.platform.commons.util.CollectionUtils.getOnlyElement;
3029
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClasses;
3130
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod;
@@ -75,7 +74,6 @@
7574
import org.junit.jupiter.api.parallel.Execution;
7675
import org.junit.jupiter.api.parallel.Isolated;
7776
import org.junit.jupiter.api.parallel.ResourceLock;
78-
import org.junit.jupiter.params.ParameterizedClass;
7977
import org.junit.jupiter.params.ParameterizedTest;
8078
import org.junit.jupiter.params.provider.ValueSource;
8179
import org.junit.platform.engine.DiscoverySelector;
@@ -91,10 +89,7 @@
9189
* @since 1.3
9290
*/
9391
@SuppressWarnings({ "JUnitMalformedDeclaration", "NewClassNamingConvention" })
94-
@ParameterizedClass
95-
@ValueSource(classes = { ForkJoinPoolHierarchicalTestExecutorService.class,
96-
ConcurrentHierarchicalTestExecutorService.class })
97-
record ParallelExecutionIntegrationTests(Class<? extends HierarchicalTestExecutorService> implementation) {
92+
class ParallelExecutionIntegrationTests {
9893

9994
@Test
10095
void successfulParallelTest(TestReporter reporter) {
@@ -584,12 +579,11 @@ private EngineExecutionResults executeWithFixedParallelism(int parallelism, Map<
584579
return executeWithFixedParallelism(parallelism, configParams, selectClasses(testClasses));
585580
}
586581

587-
private EngineExecutionResults executeWithFixedParallelism(int parallelism, Map<String, String> configParams,
582+
private static EngineExecutionResults executeWithFixedParallelism(int parallelism, Map<String, String> configParams,
588583
List<? extends DiscoverySelector> selectors) {
589584
return EngineTestKit.engine("junit-jupiter") //
590585
.selectors(selectors) //
591586
.configurationParameter(PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME, String.valueOf(true)) //
592-
.configurationParameter(PARALLEL_EXECUTION_EXECUTOR_PROPERTY_NAME, implementation.getName()) //
593587
.configurationParameter(PARALLEL_CONFIG_STRATEGY_PROPERTY_NAME, "fixed") //
594588
.configurationParameter(PARALLEL_CONFIG_FIXED_PARALLELISM_PROPERTY_NAME, String.valueOf(parallelism)) //
595589
.configurationParameters(configParams) //

platform-tooling-support-tests/src/test/resources/junit-platform.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
junit.jupiter.execution.parallel.enabled=true
2-
junit.jupiter.execution.parallel.executor=org.junit.platform.engine.support.hierarchical.ConcurrentHierarchicalTestExecutorService
32
junit.jupiter.execution.parallel.mode.default=concurrent
43
junit.jupiter.execution.parallel.config.strategy=dynamic
54
junit.jupiter.execution.parallel.config.dynamic.factor=0.25

0 commit comments

Comments
 (0)