|
40 | 40 | */ |
41 | 41 | package org.graalvm.junit.platform; |
42 | 42 |
|
| 43 | +import org.graalvm.junit.platform.config.NativeImageConfigurationImpl; |
| 44 | +import org.graalvm.junit.platform.config.core.PluginConfigProvider; |
43 | 45 | import org.graalvm.nativeimage.ImageSingletons; |
44 | 46 | import org.graalvm.nativeimage.hosted.Feature; |
45 | 47 | import org.graalvm.nativeimage.hosted.RuntimeClassInitialization; |
46 | | -import org.graalvm.nativeimage.hosted.RuntimeReflection; |
47 | 48 | import org.junit.platform.engine.DiscoverySelector; |
48 | 49 | import org.junit.platform.engine.discovery.DiscoverySelectors; |
49 | 50 | import org.junit.platform.engine.support.descriptor.ClassSource; |
|
60 | 61 | import java.io.IOException; |
61 | 62 | import java.io.InputStream; |
62 | 63 | import java.io.InputStreamReader; |
63 | | -import java.lang.reflect.Field; |
64 | | -import java.lang.reflect.Method; |
65 | 64 | import java.nio.file.Path; |
66 | 65 | import java.util.HashSet; |
67 | 66 | import java.util.List; |
68 | 67 | import java.util.Optional; |
| 68 | +import java.util.ServiceLoader; |
| 69 | +import java.util.function.Consumer; |
69 | 70 | import java.util.stream.Collectors; |
70 | 71 |
|
71 | 72 | @SuppressWarnings("unused") |
72 | 73 | public final class JUnitPlatformFeature implements Feature { |
73 | 74 |
|
74 | | - final boolean debug = System.getProperty("debug") != null; |
| 75 | + public final boolean debug = System.getProperty("debug") != null; |
| 76 | + |
| 77 | + private static final NativeImageConfigurationImpl nativeImageConfigImpl = new NativeImageConfigurationImpl(); |
| 78 | + private final ServiceLoader<PluginConfigProvider> extensionConfigProviders = ServiceLoader.load(PluginConfigProvider.class); |
75 | 79 |
|
76 | 80 | @Override |
77 | 81 | public void duringSetup(DuringSetupAccess access) { |
78 | | - try { |
79 | | - RuntimeReflection.register(org.junit.platform.commons.annotation.Testable.class.getMethods()); |
80 | | - RuntimeReflection.register(Class.forName("org.junit.jupiter.params.ParameterizedTestExtension").getDeclaredMethods()); |
81 | | - RuntimeReflection.registerForReflectiveInstantiation(Class.forName("org.junit.jupiter.params.ParameterizedTestExtension")); |
82 | | - RuntimeReflection.register(Class.forName("org.junit.jupiter.params.provider.CsvArgumentsProvider").getMethods()); |
83 | | - RuntimeReflection.register(Class.forName("org.junit.jupiter.params.provider.CsvArgumentsProvider").getDeclaredMethods()); |
84 | | - RuntimeReflection.registerForReflectiveInstantiation(Class.forName("org.junit.jupiter.params.provider.CsvArgumentsProvider")); |
85 | | - } catch (ClassNotFoundException e) { |
86 | | - throw new RuntimeException("Missing some JUnit Platform classes for runtime reflection configuration. \n" + |
87 | | - "Check if JUnit Platform is on your classpath or if that version is supported. \n" + |
88 | | - "Original error: " + e); |
89 | | - } |
| 82 | + forEachProvider(p -> p.onLoad(nativeImageConfigImpl)); |
90 | 83 | } |
91 | 84 |
|
92 | 85 | @Override |
93 | 86 | public void beforeAnalysis(BeforeAnalysisAccess access) { |
94 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.vintage.engine.support.UniqueIdReader"); |
95 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.vintage.engine.support.UniqueIdStringifier"); |
96 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.launcher.core.InternalTestPlan"); |
97 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.commons.util.StringUtils"); |
98 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.launcher.core.TestExecutionListenerRegistry"); |
99 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.commons.logging.LoggerFactory$DelegatingLogger"); |
100 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.launcher.core.EngineDiscoveryOrchestrator"); |
101 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.launcher.core.LauncherConfigurationParameters"); |
102 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.commons.logging.LoggerFactory"); |
103 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.config.EnumConfigurationParameterConverter"); |
104 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.ClassTestDescriptor"); |
105 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor"); |
106 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.TestFactoryTestDescriptor"); |
107 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.engine.UniqueIdFormat"); |
108 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.JupiterTestDescriptor"); |
109 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor"); |
110 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor"); |
111 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.platform.commons.util.ReflectionUtils"); |
112 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor"); |
113 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.execution.ConditionEvaluator"); |
114 | | - RuntimeClassInitialization.initializeAtBuildTime("org.junit.jupiter.engine.execution.ExecutableInvoker"); |
115 | 87 | RuntimeClassInitialization.initializeAtBuildTime(NativeImageJUnitLauncher.class); |
116 | 88 |
|
117 | 89 | Launcher launcher = LauncherFactory.create(); |
@@ -166,13 +138,13 @@ private void registerTestClassForReflection(Class<?> clazz) { |
166 | 138 | if (debug) { |
167 | 139 | System.out.println("[Debug] Registering test class for reflection: " + clazz.getName()); |
168 | 140 | } |
169 | | - RuntimeReflection.register(clazz.getDeclaredConstructors()); |
| 141 | + nativeImageConfigImpl.registerAllClassMembersForReflection(clazz); |
| 142 | + forEachProvider(p -> p.onTestClassRegistered(clazz, nativeImageConfigImpl)); |
| 143 | + } |
170 | 144 |
|
171 | | - for (Field field : clazz.getDeclaredFields()) { |
172 | | - RuntimeReflection.register(field); |
173 | | - } |
174 | | - for (Method method : clazz.getDeclaredMethods()) { |
175 | | - RuntimeReflection.register(method); |
| 145 | + private void forEachProvider(Consumer<PluginConfigProvider> consumer) { |
| 146 | + for (PluginConfigProvider provider: extensionConfigProviders) { |
| 147 | + consumer.accept(provider); |
176 | 148 | } |
177 | 149 | } |
178 | 150 | } |
0 commit comments