From 00e45b798b2c9c24461d80e716d62e6086f25f0a Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Mon, 11 Sep 2023 11:26:33 +0200 Subject: [PATCH 1/6] Simplify config providers with `Utils.toClasses()`. --- .../NativeImageConfigurationImpl.java | 12 ---- .../config/core/NativeImageConfiguration.java | 9 ++- .../config/jupiter/JupiterConfigProvider.java | 19 ++---- .../platform/PlatformConfigProvider.java | 7 +-- .../junit/platform/config/util/Utils.java | 60 +++++++++++++++++++ .../config/vintage/VintageConfigProvider.java | 7 +-- 6 files changed, 76 insertions(+), 38 deletions(-) create mode 100644 common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/Utils.java diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/NativeImageConfigurationImpl.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/NativeImageConfigurationImpl.java index 3e0a440cd..acda95462 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/NativeImageConfigurationImpl.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/NativeImageConfigurationImpl.java @@ -65,18 +65,6 @@ public void registerForReflection(Field... fields) { RuntimeReflection.register(fields); } - @Override - public void initializeAtBuildTime(String... classNames) { - for (String className : classNames) { - Class clazz; - try { - clazz = Class.forName(className); - initializeAtBuildTime(clazz); - } catch (ClassNotFoundException e) { - JUnitPlatformFeature.debug("[Native Image Configuration] Failed to register class for build time initialization: %s Reason: %s", className, e); - } - } - } @Override public void initializeAtBuildTime(Class... classes) { diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/NativeImageConfiguration.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/NativeImageConfiguration.java index de35a6cfb..42e1f736c 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/NativeImageConfiguration.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/NativeImageConfiguration.java @@ -42,6 +42,7 @@ package org.graalvm.junit.platform.config.core; import org.graalvm.junit.platform.JUnitPlatformFeature; +import org.graalvm.junit.platform.config.util.Utils; import java.lang.reflect.Executable; import java.lang.reflect.Field; @@ -54,6 +55,10 @@ public interface NativeImageConfiguration { void registerForReflection(Field... fields); + default void registerAllClassMembersForReflection(String... classNames) { + registerAllClassMembersForReflection(Utils.toClasses(classNames)); + }; + default void registerAllClassMembersForReflection(Class... classes) { for (Class clazz : classes) { JUnitPlatformFeature.debug("[Native Image Configuration] Registering for reflection: %s", clazz.getName()); @@ -64,7 +69,9 @@ default void registerAllClassMembersForReflection(Class... classes) { } } - void initializeAtBuildTime(String... classNames); + default void initializeAtBuildTime(String... classNames) { + initializeAtBuildTime(Utils.toClasses(classNames)); + }; void initializeAtBuildTime(Class... classes); } diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java index fd6e98d9a..bcb2db2a9 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java @@ -68,7 +68,7 @@ public class JupiterConfigProvider implements PluginConfigProvider { @Override public void onLoad(NativeImageConfiguration config) { - String[] buildTimeInitializedClasses = new String[]{ + config.initializeAtBuildTime( "org.junit.jupiter.engine.config.EnumConfigurationParameterConverter", "org.junit.jupiter.engine.descriptor.ClassTestDescriptor", "org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor", @@ -84,23 +84,12 @@ public void onLoad(NativeImageConfiguration config) { // new in Junit 5.10 "org.junit.platform.launcher.core.LauncherConfig", "org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter" - }; - for (String className : buildTimeInitializedClasses) { - config.initializeAtBuildTime(className); - } + ); - String[] registeredForReflection = { + config.registerAllClassMembersForReflection( "org.junit.jupiter.engine.extension.TimeoutExtension$ExecutorResource", "org.junit.jupiter.engine.extension.TimeoutInvocationFactory$SingleThreadExecutorResource" - }; - for (String className : registeredForReflection) { - try { - Class executor = Class.forName(className); - config.registerAllClassMembersForReflection(executor); - } catch (ClassNotFoundException e) { - debug("Failed to register class for reflection. Reason: %s", e); - } - } + ); } @Override diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java index d67cd5d77..b345e6ea9 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java @@ -48,7 +48,7 @@ public class PlatformConfigProvider implements PluginConfigProvider { @Override public void onLoad(NativeImageConfiguration config) { - String[] buildTimeInitializedClasses = new String[] { + config.initializeAtBuildTime( "org.junit.platform.launcher.TestIdentifier", "org.junit.platform.launcher.core.InternalTestPlan", "org.junit.platform.commons.util.StringUtils", @@ -61,10 +61,7 @@ public void onLoad(NativeImageConfiguration config) { "org.junit.platform.commons.util.ReflectionUtils", // https://github.com/graalvm/native-build-tools/issues/300 "org.junit.platform.reporting.open.xml.OpenTestReportGeneratingListener" - }; - for (String className : buildTimeInitializedClasses) { - config.initializeAtBuildTime(className); - } + ); try { /* Verify if the core JUnit Platform test class is available on the classpath */ diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/Utils.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/Utils.java new file mode 100644 index 000000000..f2021842a --- /dev/null +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/Utils.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.junit.platform.config.util; + +import org.graalvm.junit.platform.JUnitPlatformFeature; + +import java.util.Arrays; + +public class Utils { + public static Class[] toClasses(String... classNames) { + return Arrays.stream(classNames).map(className -> { + Class clazz = null; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + JUnitPlatformFeature.debug("[Native Image Configuration] Failed to resolve: %s Reason: %s", className, e); + } + return clazz; + }).filter(c -> c != null).toArray(Class[]::new); + } +} diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java index b5a6eec98..f5dc9ea22 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java @@ -48,7 +48,7 @@ public class VintageConfigProvider implements PluginConfigProvider { @Override public void onLoad(NativeImageConfiguration config) { - String[] buildTimeInitializedClasses = new String[]{ + config.initializeAtBuildTime( "org.junit.vintage.engine.descriptor.RunnerTestDescriptor", "org.junit.vintage.engine.support.UniqueIdReader", "org.junit.vintage.engine.support.UniqueIdStringifier", @@ -57,10 +57,7 @@ public void onLoad(NativeImageConfiguration config) { "org.junit.runners.JUnit4", /* Workaround until we can register serializable classes from a native-image feature */ "org.junit.runner.Result" - }; - for (String className : buildTimeInitializedClasses) { - config.initializeAtBuildTime(className); - } + ); } @Override From 7efbcd5c6c277a6ce94cb6ab71d5927e2c36030c Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Mon, 11 Sep 2023 15:45:08 +0200 Subject: [PATCH 2/6] Fix `escapeArg` for Windows. --- .../java/org/graalvm/buildtools/utils/NativeImageUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/utils/src/main/java/org/graalvm/buildtools/utils/NativeImageUtils.java b/common/utils/src/main/java/org/graalvm/buildtools/utils/NativeImageUtils.java index 6bf91a53f..c20023f10 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/utils/NativeImageUtils.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/utils/NativeImageUtils.java @@ -116,7 +116,10 @@ public static String escapeArg(String arg) { if (m.matches()) { return arg; } - return "'" + arg.replace("'", "'\"'\"'") + "'"; + return "'" + arg + .replace("'", "'\"'\"'") + .replace("\\", "\\\\") /* for Windows paths */ + + "'"; } From cb13a8664e353fa878dc40ce5e46bbf4ced041e7 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Mon, 11 Sep 2023 09:36:13 +0200 Subject: [PATCH 3/6] Add functional testing on GraalVM dev build --- .../workflows/test-native-gradle-plugin.yml | 31 +++++++++++++++++++ ...rg.graalvm.build.functional-testing.gradle | 10 +++++- ....build.maven-functional-testing.gradle.kts | 8 +++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-native-gradle-plugin.yml b/.github/workflows/test-native-gradle-plugin.yml index cfbce0079..b1bd1a2b6 100644 --- a/.github/workflows/test-native-gradle-plugin.yml +++ b/.github/workflows/test-native-gradle-plugin.yml @@ -45,6 +45,37 @@ jobs: with: name: unit-tests-results path: native-gradle-plugin/build/reports/tests/test/ + functional-testing-gradle-plugin-dev: + name: "Functional testing (GraalVM Dev Build)" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + java-version: [ 17 ] + os: [ ubuntu-20.04 ] + steps: + - name: "☁️ Checkout repository" + uses: actions/checkout@v2 + - uses: ./.github/actions/prepare-environment + with: + java-version: ${{ matrix.java-version }} + github-token: ${{ secrets.GITHUB_TOKEN }} + - name: "🔧 Install GraalVM (dev)" + uses: graalvm/setup-graalvm@main + with: + components: 'native-image' + github-token: ${{ inputs.github-token }} + java-version: 'dev' + distribution: 'graalvm' + set-java-home: 'false' + - name: "❓ Check and test the plugin" + run: ./gradlew :native-gradle-plugin:functionalTest + - name: "📜 Upload functional tests results" + if: always() + uses: actions/upload-artifact@v2 + with: + name: functional-tests-results-graalvm-dev + path: native-gradle-plugin/build/reports/tests/functionalTest/ functional-testing-gradle-plugin: name: "Functional testing" runs-on: ${{ matrix.os }} diff --git a/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle b/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle index fb0b908e9..71d44d144 100644 --- a/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle +++ b/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle @@ -74,6 +74,7 @@ configurations { gradlePlugin.testSourceSets(sourceSets.functionalTest) configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation) +def graalVmHomeProvider = providers.environmentVariable("GRAALVM_HOME") def graalVm = javaToolchains.launcherFor { languageVersion.set(JavaLanguageVersion.of(17)) // vendor.set(JvmVendorSpec.matching("Oracle Corporation")) @@ -99,7 +100,14 @@ def fullFunctionalTest = tasks.register("fullFunctionalTest") systemProperty('common.repo.url', configurations.functionalTestCommonRepository.incoming.files.files[0]) systemProperty('gradle.test.version', effectiveVersion) systemProperty('versions.junit', libs.versions.junitJupiter.get()) - environment('GRAALVM_HOME', graalVm.get().metadata.installationPath.asFile.absolutePath) + environment('GRAALVM_HOME', graalVmHomeProvider. + orElse(providers.provider(() -> graalVm.get().metadata.installationPath.asFile.absolutePath)) + .map { + println("Test task $taskName will use GRAALVM_HOME = $it") + it + } + .get() + ) testClassesDirs = sourceSets.functionalTest.output.classesDirs classpath = sourceSets.functionalTest.runtimeClasspath javaLauncher.set(graalVm) diff --git a/native-maven-plugin/build-plugins/src/main/kotlin/org.graalvm.build.maven-functional-testing.gradle.kts b/native-maven-plugin/build-plugins/src/main/kotlin/org.graalvm.build.maven-functional-testing.gradle.kts index 707a0cb23..7e16156cc 100644 --- a/native-maven-plugin/build-plugins/src/main/kotlin/org.graalvm.build.maven-functional-testing.gradle.kts +++ b/native-maven-plugin/build-plugins/src/main/kotlin/org.graalvm.build.maven-functional-testing.gradle.kts @@ -64,6 +64,8 @@ configurations { } } +val graalVmHomeProvider = providers.environmentVariable("GRAALVM_HOME") + // Add a task to run the functional tests tasks.register("functionalTest") { // Any change to samples invalidates functional tests @@ -82,4 +84,10 @@ tasks.named("check") { tasks.withType().configureEach { useJUnitPlatform() + if (graalVmHomeProvider.isPresent) { + val graalvmHome = graalVmHomeProvider.get() + inputs.property("GRAALVM_HOME", graalvmHome) + environment("GRAALVM_HOME", graalvmHome) + println("Task $name will use GRAALVM_HOME = $graalvmHome") + } } From c8da197b57a035c09dbf4913f11eeab4204835b9 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Mon, 11 Sep 2023 16:40:59 +0200 Subject: [PATCH 4/6] Skip PGO test on GraalVM dev builds. --- .github/workflows/test-native-gradle-plugin.yml | 2 ++ .../main/groovy/org.graalvm.build.functional-testing.gradle | 4 ++++ .../buildtools/gradle/JavaApplicationFunctionalTest.groovy | 2 ++ 3 files changed, 8 insertions(+) diff --git a/.github/workflows/test-native-gradle-plugin.yml b/.github/workflows/test-native-gradle-plugin.yml index b1bd1a2b6..2035f2ee5 100644 --- a/.github/workflows/test-native-gradle-plugin.yml +++ b/.github/workflows/test-native-gradle-plugin.yml @@ -48,6 +48,8 @@ jobs: functional-testing-gradle-plugin-dev: name: "Functional testing (GraalVM Dev Build)" runs-on: ${{ matrix.os }} + env: + IS_GRAALVM_DEV_BUILD: 'true' strategy: fail-fast: false matrix: diff --git a/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle b/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle index 71d44d144..96bc6b1c4 100644 --- a/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle +++ b/build-logic/gradle-functional-testing/src/main/groovy/org.graalvm.build.functional-testing.gradle @@ -75,6 +75,7 @@ gradlePlugin.testSourceSets(sourceSets.functionalTest) configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation) def graalVmHomeProvider = providers.environmentVariable("GRAALVM_HOME") +def isGraalVmDevBuild = providers.environmentVariable("IS_GRAALVM_DEV_BUILD") def graalVm = javaToolchains.launcherFor { languageVersion.set(JavaLanguageVersion.of(17)) // vendor.set(JvmVendorSpec.matching("Oracle Corporation")) @@ -108,6 +109,9 @@ def fullFunctionalTest = tasks.register("fullFunctionalTest") } .get() ) + if (isGraalVmDevBuild.isPresent()) { + environment('IS_GRAALVM_DEV_BUILD', 'true') + } testClassesDirs = sourceSets.functionalTest.output.classesDirs classpath = sourceSets.functionalTest.runtimeClasspath javaLauncher.set(graalVm) diff --git a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/JavaApplicationFunctionalTest.groovy b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/JavaApplicationFunctionalTest.groovy index 5591d5d9c..ec8b25587 100644 --- a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/JavaApplicationFunctionalTest.groovy +++ b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/JavaApplicationFunctionalTest.groovy @@ -43,6 +43,7 @@ package org.graalvm.buildtools.gradle import org.graalvm.buildtools.gradle.fixtures.AbstractFunctionalTest import spock.lang.Ignore +import spock.lang.IgnoreIf import spock.lang.Issue import spock.lang.Requires @@ -217,6 +218,7 @@ class JavaApplicationFunctionalTest extends AbstractFunctionalTest { } + @IgnoreIf({ System.getenv("IS_GRAALVM_DEV_BUILD") }) def "can build a native image with PGO instrumentation"() { def pgoDir = file("src/pgo-profiles/main").toPath() def nativeApp = file("build/native/nativeCompile/java-application-instrumented") From bbb9daca28c5b9f08a153b792829e37519fa3a56 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Mon, 11 Sep 2023 16:40:29 +0200 Subject: [PATCH 5/6] Update JUnit config for GraalVM for JDK 21. --- .../config/core/PluginConfigProvider.java | 4 ++++ .../config/jupiter/JupiterConfigProvider.java | 21 ++++++++++++++++ .../platform/PlatformConfigProvider.java | 24 +++++++++++++++++++ .../config/vintage/VintageConfigProvider.java | 13 ++++++++++ 4 files changed, 62 insertions(+) diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java index 8b104c489..d55c59e81 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java @@ -47,4 +47,8 @@ public interface PluginConfigProvider { void onTestClassRegistered(Class testClass, NativeImageConfiguration registry); + default int getMajorJDKVersion() { + return Runtime.version().feature(); + } + } diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java index bcb2db2a9..4e9b1c955 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java @@ -86,6 +86,27 @@ public void onLoad(NativeImageConfiguration config) { "org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter" ); + if (getMajorJDKVersion() >= 21) { + /* new with simulated class initialization */ + config.initializeAtBuildTime( + "org.junit.jupiter.api.DisplayNameGenerator$Standard", + "org.junit.jupiter.api.extension.ConditionEvaluationResult", + "org.junit.jupiter.api.TestInstance$Lifecycle", + "org.junit.jupiter.engine.config.CachingJupiterConfiguration", + "org.junit.jupiter.engine.config.DefaultJupiterConfiguration", + "org.junit.jupiter.engine.descriptor.DynamicDescendantFilter", + "org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor", + "org.junit.jupiter.engine.descriptor.NestedClassTestDescriptor", + "org.junit.jupiter.engine.execution.InterceptingExecutableInvoker", + "org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall", + "org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall$VoidMethodInterceptorCall", + "org.junit.jupiter.engine.execution.InvocationInterceptorChain", + "org.junit.jupiter.engine.JupiterTestEngine", + "org.junit.jupiter.params.provider.EnumSource$Mode$Validator" + ); + } + + config.registerAllClassMembersForReflection( "org.junit.jupiter.engine.extension.TimeoutExtension$ExecutorResource", "org.junit.jupiter.engine.extension.TimeoutInvocationFactory$SingleThreadExecutorResource" diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java index b345e6ea9..9e666c236 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java @@ -63,6 +63,30 @@ public void onLoad(NativeImageConfiguration config) { "org.junit.platform.reporting.open.xml.OpenTestReportGeneratingListener" ); + if (getMajorJDKVersion() >= 21) { + /* new with simulated class initialization */ + config.initializeAtBuildTime( + "org.junit.platform.engine.support.descriptor.ClassSource", + "org.junit.platform.engine.support.descriptor.MethodSource", + "org.junit.platform.engine.support.hierarchical.Node$ExecutionMode", + "org.junit.platform.engine.TestDescriptor$Type", + "org.junit.platform.engine.UniqueId", + "org.junit.platform.engine.UniqueId$Segment", + "org.junit.platform.launcher.core.DefaultLauncher", + "org.junit.platform.launcher.core.DefaultLauncherConfig", + "org.junit.platform.launcher.core.EngineExecutionOrchestrator", + "org.junit.platform.launcher.core.LauncherConfigurationParameters$ParameterProvider$2", + "org.junit.platform.launcher.core.LauncherConfigurationParameters$ParameterProvider$3", + "org.junit.platform.launcher.core.LauncherDiscoveryResult", + "org.junit.platform.launcher.core.LauncherListenerRegistry", + "org.junit.platform.launcher.core.ListenerRegistry", + "org.junit.platform.launcher.core.SessionPerRequestLauncher", + "org.junit.platform.launcher.LauncherSessionListener$1", + "org.junit.platform.launcher.listeners.UniqueIdTrackingListener", + "org.junit.platform.reporting.shadow.org.opentest4j.reporting.events.api.DocumentWriter$1" + ); + } + try { /* Verify if the core JUnit Platform test class is available on the classpath */ Class.forName("org.junit.platform.commons.annotation.Testable"); diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java index f5dc9ea22..af653cbbe 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java @@ -58,6 +58,19 @@ public void onLoad(NativeImageConfiguration config) { /* Workaround until we can register serializable classes from a native-image feature */ "org.junit.runner.Result" ); + + if (getMajorJDKVersion() >= 21) { + /* new with simulated class initialization */ + config.initializeAtBuildTime( + "java.lang.annotation.Annotation", + "org.junit.runners.model.FrameworkMethod", + "org.junit.runners.model.TestClass", + "org.junit.runners.ParentRunner$1", + "org.junit.Test", + "org.junit.vintage.engine.descriptor.VintageEngineDescriptor", + "org.junit.vintage.engine.VintageTestEngine" + ); + } } @Override From e13d5170c081fa4643fa6f04ab6c93b2732745f8 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Tue, 12 Sep 2023 15:36:51 +0200 Subject: [PATCH 6/6] Add changelog entries. [ci skip] --- docs/src/docs/asciidoc/index.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/docs/asciidoc/index.adoc b/docs/src/docs/asciidoc/index.adoc index fffc842a6..39ea81ccd 100644 --- a/docs/src/docs/asciidoc/index.adoc +++ b/docs/src/docs/asciidoc/index.adoc @@ -19,6 +19,11 @@ If you are using alternative build systems, see <