diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc index 5036080544ab..ae54a84b1809 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc @@ -19,7 +19,8 @@ repository on GitHub. ==== Deprecations and Breaking Changes -* ❓ +* Building native images with GraalVM now requires configuring the build arg + `--initialize-at-build-time=org.junit.platform.launcher.core.LauncherConfig`. ==== New Features and Improvements diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java index adf3739b39e0..abeeb298acaa 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java @@ -23,8 +23,6 @@ */ class EngineIdValidator { - private static final Logger logger = LoggerFactory.getLogger(EngineIdValidator.class); - private EngineIdValidator() { } @@ -33,7 +31,7 @@ static Iterable validate(Iterable testEngines) { for (TestEngine testEngine : testEngines) { // check usage of reserved id prefix if (!validateReservedIds(testEngine)) { - logger.warn(() -> String.format( + getLogger().warn(() -> String.format( "Third-party TestEngine implementations are forbidden to use the reserved 'junit-' prefix for their ID: '%s'", testEngine.getId())); } @@ -47,6 +45,11 @@ static Iterable validate(Iterable testEngines) { return testEngines; } + private static Logger getLogger() { + // Not a constant to avoid problems with building GraalVM native images + return LoggerFactory.getLogger(EngineIdValidator.class); + } + // https://github.com/junit-team/junit5/issues/1557 private static boolean validateReservedIds(TestEngine testEngine) { String engineId = testEngine.getId(); diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherFactory.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherFactory.java index eb60ce260404..172db2b89a34 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherFactory.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherFactory.java @@ -66,8 +66,6 @@ @API(status = STABLE, since = "1.0") public class LauncherFactory { - private static final ServiceLoaderRegistry SERVICE_LOADER_REGISTRY = new ServiceLoaderRegistry(); - private LauncherFactory() { /* no-op */ } @@ -151,7 +149,7 @@ private static List collectLauncherInterceptors( LauncherConfigurationParameters configurationParameters) { if (configurationParameters.getBoolean(ENABLE_LAUNCHER_INTERCEPTORS).orElse(false)) { List interceptors = new ArrayList<>(); - SERVICE_LOADER_REGISTRY.load(LauncherInterceptor.class).forEach(interceptors::add); + ServiceLoaderRegistry.load(LauncherInterceptor.class).forEach(interceptors::add); return interceptors; } return emptyList(); @@ -169,7 +167,7 @@ private static Set collectTestEngines(LauncherConfig config) { private static LauncherSessionListener createLauncherSessionListener(LauncherConfig config) { ListenerRegistry listenerRegistry = ListenerRegistry.forLauncherSessionListeners(); if (config.isLauncherSessionListenerAutoRegistrationEnabled()) { - SERVICE_LOADER_REGISTRY.load(LauncherSessionListener.class).forEach(listenerRegistry::add); + ServiceLoaderRegistry.load(LauncherSessionListener.class).forEach(listenerRegistry::add); } config.getAdditionalLauncherSessionListeners().forEach(listenerRegistry::add); return listenerRegistry.getCompositeListener(); @@ -178,7 +176,7 @@ private static LauncherSessionListener createLauncherSessionListener(LauncherCon private static List collectPostDiscoveryFilters(LauncherConfig config) { List filters = new ArrayList<>(); if (config.isPostDiscoveryFilterAutoRegistrationEnabled()) { - SERVICE_LOADER_REGISTRY.load(PostDiscoveryFilter.class).forEach(filters::add); + ServiceLoaderRegistry.load(PostDiscoveryFilter.class).forEach(filters::add); } filters.addAll(config.getAdditionalPostDiscoveryFilters()); return filters; @@ -186,7 +184,7 @@ private static List collectPostDiscoveryFilters(LauncherCon private static void registerLauncherDiscoveryListeners(LauncherConfig config, Launcher launcher) { if (config.isLauncherDiscoveryListenerAutoRegistrationEnabled()) { - SERVICE_LOADER_REGISTRY.load(LauncherDiscoveryListener.class).forEach( + ServiceLoaderRegistry.load(LauncherDiscoveryListener.class).forEach( launcher::registerLauncherDiscoveryListeners); } config.getAdditionalLauncherDiscoveryListeners().forEach(launcher::registerLauncherDiscoveryListeners); @@ -203,7 +201,7 @@ private static void registerTestExecutionListeners(LauncherConfig config, Launch private static Stream loadAndFilterTestExecutionListeners( ConfigurationParameters configurationParameters) { - Iterable listeners = SERVICE_LOADER_REGISTRY.load(TestExecutionListener.class); + Iterable listeners = ServiceLoaderRegistry.load(TestExecutionListener.class); String deactivatedListenersPattern = configurationParameters.get( DEACTIVATE_LISTENERS_PATTERN_PROPERTY_NAME).orElse(null); // @formatter:off diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java index 47ccd2f23095..54b446cce41a 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java @@ -24,13 +24,16 @@ */ class ServiceLoaderRegistry { - private static final Logger logger = LoggerFactory.getLogger(ServiceLoaderRegistry.class); - - Iterable load(Class serviceProviderClass) { + static Iterable load(Class serviceProviderClass) { Iterable listeners = ServiceLoader.load(serviceProviderClass, ClassLoaderUtils.getDefaultClassLoader()); - logger.config(() -> "Loaded " + serviceProviderClass.getSimpleName() + " instances: " + getLogger().config(() -> "Loaded " + serviceProviderClass.getSimpleName() + " instances: " + stream(listeners.spliterator(), false).map(Object::toString).collect(toList())); return listeners; } + private static Logger getLogger() { + // Not a constant to avoid problems with building GraalVM native images + return LoggerFactory.getLogger(ServiceLoaderRegistry.class); + } + } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderTestEngineRegistry.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderTestEngineRegistry.java index 00233a6b44db..9959e6e3a2e7 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderTestEngineRegistry.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderTestEngineRegistry.java @@ -29,13 +29,16 @@ public final class ServiceLoaderTestEngineRegistry { public ServiceLoaderTestEngineRegistry() { } - private static final Logger logger = LoggerFactory.getLogger(ServiceLoaderTestEngineRegistry.class); - public Iterable loadTestEngines() { Iterable testEngines = ServiceLoader.load(TestEngine.class, ClassLoaderUtils.getDefaultClassLoader()); - logger.config(() -> TestEngineFormatter.format("Discovered TestEngines", testEngines)); + getLogger().config(() -> TestEngineFormatter.format("Discovered TestEngines", testEngines)); return testEngines; } + private static Logger getLogger() { + // Not a constant to avoid problems with building GraalVM native images + return LoggerFactory.getLogger(ServiceLoaderTestEngineRegistry.class); + } + } diff --git a/platform-tooling-support-tests/projects/graalvm-starter/build.gradle.kts b/platform-tooling-support-tests/projects/graalvm-starter/build.gradle.kts index edd8bd7b7474..cd346c7f1ac5 100644 --- a/platform-tooling-support-tests/projects/graalvm-starter/build.gradle.kts +++ b/platform-tooling-support-tests/projects/graalvm-starter/build.gradle.kts @@ -27,3 +27,12 @@ tasks.test { ) } } + +graalvmNative { + binaries { + named("test") { + buildArgs.add("--initialize-at-build-time=org.junit.platform.launcher.core.LauncherConfig") + buildArgs.add("-H:+ReportExceptionStackTraces") + } + } +}