Skip to content

Commit c37ce67

Browse files
marcphilippdnestoro
authored andcommitted
Extract TestClassRegistrar
1 parent a5cd92d commit c37ce67

File tree

2 files changed

+101
-45
lines changed

2 files changed

+101
-45
lines changed

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/JUnitPlatformFeature.java

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,9 @@
6666
import java.io.UncheckedIOException;
6767
import java.nio.file.Files;
6868
import java.nio.file.Path;
69-
import java.util.HashSet;
7069
import java.util.List;
7170
import java.util.Optional;
7271
import java.util.ServiceLoader;
73-
import java.util.Set;
7472
import java.util.function.BiConsumer;
7573
import java.util.function.Consumer;
7674
import java.util.stream.Collectors;
@@ -157,6 +155,12 @@ private void registerTestClassesForReflection(List<? extends DiscoverySelector>
157155
.selectors(selectors)
158156
.build();
159157

158+
TestClassRegistrar testClassRegistrar = new TestClassRegistrar(clazz -> {
159+
debug("Registering test class for reflection: %s", clazz.getName());
160+
nativeImageConfigImpl.registerAllClassMembersForReflection(clazz);
161+
forEachProvider(p -> p.onTestClassRegistered(clazz, nativeImageConfigImpl));
162+
});
163+
160164
Launcher launcher = LauncherFactory.create();
161165
TestPlan testPlan = launcher.discover(request);
162166
testPlan.getRoots().stream()
@@ -167,49 +171,7 @@ private void registerTestClassesForReflection(List<? extends DiscoverySelector>
167171
.filter(ClassSource.class::isInstance)
168172
.map(ClassSource.class::cast)
169173
.map(ClassSource::getJavaClass)
170-
.forEach(this::registerTestClassForReflection);
171-
}
172-
173-
private final Set<Class<?>> registeredClasses = new HashSet<>();
174-
175-
private boolean shouldRegisterClass(Class<?> clazz) {
176-
/* avoid registering java internal classes */
177-
if (ModuleLayer.boot().modules().contains(clazz.getModule())) {
178-
return false;
179-
}
180-
181-
/* avoid loops (possible case: class B is inner class of A, and B extends A) */
182-
if (registeredClasses.contains(clazz)) {
183-
return false;
184-
}
185-
registeredClasses.add(clazz);
186-
187-
return true;
188-
}
189-
190-
private void registerTestClassForReflection(Class<?> clazz) {
191-
if (!shouldRegisterClass(clazz)) {
192-
return;
193-
}
194-
195-
debug("Registering test class for reflection: %s", clazz.getName());
196-
nativeImageConfigImpl.registerAllClassMembersForReflection(clazz);
197-
forEachProvider(p -> p.onTestClassRegistered(clazz, nativeImageConfigImpl));
198-
199-
Class<?>[] declaredClasses = clazz.getDeclaredClasses();
200-
for (Class<?> declaredClass : declaredClasses) {
201-
registerTestClassForReflection(declaredClass);
202-
}
203-
204-
Class<?>[] interfaces = clazz.getInterfaces();
205-
for (Class<?> inter : interfaces) {
206-
registerTestClassForReflection(inter);
207-
}
208-
209-
Class<?> superClass = clazz.getSuperclass();
210-
if (superClass != null && superClass != Object.class) {
211-
registerTestClassForReflection(superClass);
212-
}
174+
.forEach(testClassRegistrar::registerTestClassForReflection);
213175
}
214176

215177
private void forEachProvider(Consumer<PluginConfigProvider> consumer) {
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
42+
package org.graalvm.junit.platform;
43+
44+
import java.util.HashSet;
45+
import java.util.Set;
46+
import java.util.function.Consumer;
47+
48+
class TestClassRegistrar {
49+
50+
private final Set<Class<?>> registeredClasses = new HashSet<>();
51+
private final Consumer<Class<?>> registrationCallback;
52+
53+
TestClassRegistrar(Consumer<Class<?>> registrationCallback) {
54+
this.registrationCallback = registrationCallback;
55+
}
56+
57+
void registerTestClassForReflection(Class<?> clazz) {
58+
if (!shouldRegisterClass(clazz)) {
59+
return;
60+
}
61+
62+
registrationCallback.accept(clazz);
63+
64+
Class<?>[] declaredClasses = clazz.getDeclaredClasses();
65+
for (Class<?> declaredClass : declaredClasses) {
66+
registerTestClassForReflection(declaredClass);
67+
}
68+
69+
Class<?>[] interfaces = clazz.getInterfaces();
70+
for (Class<?> inter : interfaces) {
71+
registerTestClassForReflection(inter);
72+
}
73+
74+
Class<?> superClass = clazz.getSuperclass();
75+
if (superClass != null && superClass != Object.class) {
76+
registerTestClassForReflection(superClass);
77+
}
78+
}
79+
80+
private boolean shouldRegisterClass(Class<?> clazz) {
81+
/* avoid registering java internal classes */
82+
if (ModuleLayer.boot().modules().contains(clazz.getModule())) {
83+
return false;
84+
}
85+
86+
/* avoid loops (possible case: class B is inner class of A, and B extends A) */
87+
if (registeredClasses.contains(clazz)) {
88+
return false;
89+
}
90+
registeredClasses.add(clazz);
91+
92+
return true;
93+
}
94+
}

0 commit comments

Comments
 (0)