Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
cfb6845
Enable specific global extension in JUnit 5
YongGoose Nov 12, 2024
07a6ae3
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Nov 14, 2024
4a896f1
Add Java 9+ variant for optimized ServiceLoader filtering
YongGoose Nov 14, 2024
7c58f66
Merge branch 'main' into feature/enable-specific-global-extensions-in…
YongGoose Nov 16, 2024
09dca93
Remove final keyword
YongGoose Nov 18, 2024
355e113
Merge branch 'main' into feature/enable-specific-global-extensions-in…
YongGoose Nov 18, 2024
2568ffe
Avoid instantiating deactivated TestExecutionListeners
marcphilipp Nov 19, 2024
d5a3511
Pass ServiceLoader to Utils to avoid failing its caller check
marcphilipp Nov 19, 2024
a599008
Merge pull request #1 from junit-team/marc/avoid-deactivated-test-exe…
YongGoose Nov 19, 2024
8b2f41e
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Nov 19, 2024
eb32053
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Nov 19, 2024
1597992
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Nov 19, 2024
eb1b5b3
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Nov 19, 2024
f86c1d6
Add constants and javadoc for supported syntax
YongGoose Nov 19, 2024
02c91b5
move code to JupiterConfiguration
YongGoose Nov 19, 2024
3c95ac9
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/co…
YongGoose Nov 27, 2024
624760b
Rename method
YongGoose Nov 27, 2024
6c5d6c3
Add javadoc
YongGoose Nov 27, 2024
13645f0
Update user-guide
YongGoose Nov 27, 2024
9daa88a
Merge branch 'main' into feature/enable-specific-global-extensions-in…
YongGoose Nov 29, 2024
f870747
Log excluded classes once
YongGoose Nov 30, 2024
671e387
Update junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/ex…
YongGoose Dec 5, 2024
87ac022
Merge branch 'main' into feature/enable-specific-global-extensions-in…
YongGoose Dec 5, 2024
a190de6
Apply spotless
YongGoose Dec 5, 2024
13c1b19
Update user-guide
YongGoose Dec 5, 2024
6e5b161
Document new configuration parameters
marcphilipp Dec 6, 2024
ec13b6d
Add integration test
YongGoose Dec 14, 2024
ff30825
Merge remote-tracking branch 'origin/feature/enable-specific-global-e…
YongGoose Dec 14, 2024
4b3c670
Avoid 2nd loop and loading all extensions
marcphilipp Dec 16, 2024
6279713
Polish tests
marcphilipp Dec 16, 2024
93f0e2f
Improve readability
marcphilipp Dec 16, 2024
f92b14d
Return "constant" predicates for default case
marcphilipp Dec 16, 2024
fbefdc9
Remove orphaned anchor
marcphilipp Dec 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,15 @@ public final class Constants {
*/
public static final String DEACTIVATE_ALL_CONDITIONS_PATTERN = ClassNamePatternFilterUtils.ALL_PATTERN;

/**
* A blank pattern used for class name filtering: {@value}
*
* <p>This constant is used to represent an empty or blank pattern in class name filtering operations.
*
* @see ClassNamePatternFilterUtils#BLANK
*/
public static final String BLANK = ClassNamePatternFilterUtils.BLANK;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems weird to me to introduce a constant for an empty string here. Let's keep it internal and remove it from here, ok?

/**
* Property name used to set the default display name generator class name: {@value}
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.TestInstantiationAwareExtension.ExtensionContextScope;
import org.junit.jupiter.api.io.CleanupMode;
import org.junit.jupiter.api.io.TempDirFactory;
Expand All @@ -47,13 +48,8 @@ public CachingJupiterConfiguration(JupiterConfiguration delegate) {
}

@Override
public Optional<String> getExtensionAutodetectionIncludePattern() {
return delegate.getExtensionAutodetectionIncludePattern();
}

@Override
public Optional<String> getExtensionAutodetectionExcludePattern() {
return delegate.getExtensionAutodetectionExcludePattern();
public Predicate<Class<? extends Extension>> createExtensionFilterByPatterns() {
return delegate.createExtensionFilterByPatterns();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.TestInstantiationAwareExtension.ExtensionContextScope;
import org.junit.jupiter.api.io.CleanupMode;
import org.junit.jupiter.api.io.TempDirFactory;
Expand Down Expand Up @@ -74,12 +75,19 @@ public DefaultJupiterConfiguration(ConfigurationParameters configurationParamete
}

@Override
public Optional<String> getExtensionAutodetectionIncludePattern() {
public Predicate<Class<? extends Extension>> createExtensionFilterByPatterns() {
Predicate<String> predicate = ClassNamePatternFilterUtils.includeMatchingClassNames(
getExtensionAutodetectionIncludePattern().orElse(ClassNamePatternFilterUtils.ALL_PATTERN)) //
.and(ClassNamePatternFilterUtils.excludeMatchingClassNames(
getExtensionAutodetectionExcludePattern().orElse(ClassNamePatternFilterUtils.BLANK)));
return clazz -> predicate.test(clazz.getName());
}

private Optional<String> getExtensionAutodetectionIncludePattern() {
return configurationParameters.get(EXTENSIONS_AUTODETECTION_INCLUDE_PROPERTY_NAME);
}

@Override
public Optional<String> getExtensionAutodetectionExcludePattern() {
private Optional<String> getExtensionAutodetectionExcludePattern() {
return configurationParameters.get(EXTENSIONS_AUTODETECTION_EXCLUDE_PROPERTY_NAME);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.PreInterruptCallback;
import org.junit.jupiter.api.extension.TestInstantiationAwareExtension.ExtensionContextScope;
import org.junit.jupiter.api.io.CleanupMode;
Expand Down Expand Up @@ -50,9 +51,7 @@ public interface JupiterConfiguration {
String DEFAULT_TEST_CLASS_ORDER_PROPERTY_NAME = ClassOrderer.DEFAULT_ORDER_PROPERTY_NAME;;
String DEFAULT_TEST_INSTANTIATION_EXTENSION_CONTEXT_SCOPE_PROPERTY_NAME = ExtensionContextScope.DEFAULT_SCOPE_PROPERTY_NAME;

Optional<String> getExtensionAutodetectionIncludePattern();

Optional<String> getExtensionAutodetectionExcludePattern();
Predicate<Class<? extends Extension>> createExtensionFilterByPatterns();

Optional<String> getRawConfigurationParameter(String key);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import org.junit.platform.commons.logging.LoggerFactory;
import org.junit.platform.commons.support.ReflectionSupport;
import org.junit.platform.commons.util.ClassLoaderUtils;
import org.junit.platform.commons.util.ClassNamePatternFilterUtils;
import org.junit.platform.commons.util.Preconditions;
import org.junit.platform.commons.util.ServiceLoaderUtils;

Expand Down Expand Up @@ -98,23 +97,14 @@ public static MutableExtensionRegistry createRegistryWithDefaultExtensions(Jupit

private static void registerAutoDetectedExtensions(MutableExtensionRegistry extensionRegistry,
JupiterConfiguration configuration) {
Predicate<Class<? extends Extension>> filter = createExtensionFilterByPatterns(
configuration.getExtensionAutodetectionIncludePattern().orElse(ClassNamePatternFilterUtils.ALL_PATTERN),
configuration.getExtensionAutodetectionExcludePattern().orElse(""));
Predicate<Class<? extends Extension>> filter = configuration.createExtensionFilterByPatterns();

ServiceLoader<Extension> serviceLoader = ServiceLoader.load(Extension.class,
ClassLoaderUtils.getDefaultClassLoader());
ServiceLoaderUtils.filter(serviceLoader, filter) //
.forEach(extensionRegistry::registerAutoDetectedExtension);
}

private static Predicate<Class<? extends Extension>> createExtensionFilterByPatterns(String include,
String exclude) {
Predicate<String> predicate = ClassNamePatternFilterUtils.includeMatchingClassNames(include) //
.and(ClassNamePatternFilterUtils.excludeMatchingClassNames(exclude));
return clazz -> predicate.test(clazz.getName());
}

/**
* Factory for creating and populating a new registry from a list of
* extension types and a parent registry.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ private ClassNamePatternFilterUtils() {

public static final String ALL_PATTERN = "*";

public static final String BLANK = "";

/**
* Create a {@link Predicate} that can be used to exclude (i.e., filter out)
* objects of type {@code T} whose fully qualified class names match any of
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ void newRegistryWithoutParentHasDefaultExtensions() {
void newRegistryWithoutParentHasDefaultExtensionsPlusAutodetectedExtensionsLoadedViaServiceLoader() {

when(configuration.isExtensionAutoDetectionEnabled()).thenReturn(true);
when(configuration.createExtensionFilterByPatterns()).thenReturn(__ -> true);
registry = createRegistryWithDefaultExtensions(configuration);

List<Extension> extensions = registry.getExtensions(Extension.class);
Expand Down