Skip to content

Commit 829494f

Browse files
committed
Avoid adding duplicated junit entries on classpath
1 parent 8a7b6af commit 829494f

File tree

3 files changed

+80
-6
lines changed

3 files changed

+80
-6
lines changed

common/junit-platform-native/build.gradle

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,16 @@ maven {
5252
}
5353
dependencies {
5454
compileOnly libs.graalvm.svm
55-
implementation(platform(libs.test.junit.bom))
56-
implementation libs.test.junit.platform.console
57-
implementation libs.test.junit.platform.launcher
58-
implementation libs.test.junit.jupiter.core
55+
compileOnly(platform(libs.test.junit.bom))
56+
compileOnly libs.test.junit.platform.console
57+
compileOnly libs.test.junit.platform.launcher
58+
compileOnly libs.test.junit.jupiter.core
5959
testImplementation libs.test.junit.vintage
60+
61+
testRuntimeOnly(platform(libs.test.junit.bom))
62+
testRuntimeOnly libs.test.junit.platform.console
6063
testRuntimeOnly libs.test.junit.platform.launcher
64+
testRuntimeOnly libs.test.junit.jupiter.core
6165
}
6266

6367
apply from: "gradle/native-image-testing.gradle"

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ public static void main(String... args) {
123123
out.println("JUnit Platform on Native Image - report");
124124
out.println("----------------------------------------\n");
125125
out.flush();
126-
launcher.registerTestExecutionListeners(new PrintTestExecutionListener(out));
126+
configurePrintTestExecutionListener(launcher, out);
127127
}
128128

129129
SummaryGeneratingListener summaryListener = new SummaryGeneratingListener();
130130
launcher.registerTestExecutionListeners(summaryListener);
131-
launcher.registerTestExecutionListeners(new LegacyXmlReportGeneratingListener(Paths.get(xmlOutput), out));
131+
configureLegacyXMLReport(launcher, xmlOutput, out);
132132
launcher.execute(testPlan);
133133

134134
TestExecutionSummary summary = summaryListener.getSummary();
@@ -271,4 +271,21 @@ private static boolean testIdsDirectoryExists(Path directory) {
271271
return directory != null && Files.exists(directory);
272272
}
273273

274+
275+
private static void configurePrintTestExecutionListener(Launcher launcher, PrintWriter out) {
276+
try {
277+
Class.forName("org.junit.platform.reporting.legacy.LegacyReportingUtils");
278+
launcher.registerTestExecutionListeners(new PrintTestExecutionListener(out));
279+
} catch (NoClassDefFoundError | ClassNotFoundException e) {
280+
// intentionally ignored
281+
}
282+
}
283+
284+
private static void configureLegacyXMLReport(Launcher launcher, String xmlOutput, PrintWriter out) {
285+
try {
286+
launcher.registerTestExecutionListeners(new LegacyXmlReportGeneratingListener(Paths.get(xmlOutput), out));
287+
} catch (NoClassDefFoundError e) {
288+
// intentionally ignored
289+
}
290+
}
274291
}

native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/NativeTestMojo.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,13 @@
6363
import org.graalvm.buildtools.utils.FileUtils;
6464
import org.graalvm.buildtools.utils.JUnitUtils;
6565
import org.graalvm.buildtools.utils.NativeImageConfigurationUtils;
66+
import org.w3c.dom.Document;
67+
import org.xml.sax.SAXException;
6668

69+
import javax.xml.parsers.DocumentBuilder;
70+
import javax.xml.parsers.DocumentBuilderFactory;
71+
import javax.xml.parsers.ParserConfigurationException;
72+
import java.io.File;
6773
import java.io.IOException;
6874
import java.io.UncheckedIOException;
6975
import java.nio.file.Files;
@@ -135,6 +141,8 @@ protected void addDependenciesToClasspath() throws MojoExecutionException {
135141
.filter(it -> it.getGroupId().startsWith(NativeImageConfigurationUtils.MAVEN_GROUP_ID) || it.getGroupId().startsWith("org.junit"))
136142
.map(it -> it.getFile().toPath())
137143
.forEach(imageClasspath::add);
144+
145+
modules.addAll(collectJUnitModulesAlreadyOnClasspath());
138146
var jars = findJunitPlatformNativeJars(modules);
139147
imageClasspath.addAll(jars);
140148
}
@@ -310,6 +318,51 @@ private List<Path> findJunitPlatformNativeJars(Set<Module> modulesAlreadyOnClass
310318
.collect(Collectors.toList());
311319
}
312320

321+
private Set<Module> collectJUnitModulesAlreadyOnClasspath() {
322+
Set<Module> artifacts = new HashSet<>();
323+
for (Path entry : imageClasspath) {
324+
if (isJUnitArtifact(entry)) {
325+
File pom = getArtifactPOM(entry);
326+
if (pom != null) {
327+
artifacts.add(getModuleFromPOM(pom));
328+
}
329+
}
330+
}
331+
332+
return artifacts;
333+
}
334+
335+
private boolean isJUnitArtifact(Path entry) {
336+
return entry.toString().contains("junit");
337+
}
338+
339+
private File getArtifactPOM(Path classpathEntry) {
340+
List<File> artifactContent = getArtifactContent(classpathEntry.getParent());
341+
List<File> candidates = artifactContent.stream().filter(f -> f.getName().endsWith(".pom")).collect(Collectors.toList());
342+
return candidates.size() != 1 ? null : candidates.get(0);
343+
}
344+
345+
private List<File> getArtifactContent(Path path) {
346+
File[] content = path.toFile().listFiles();
347+
return content == null ? List.of() : List.of(content);
348+
}
349+
350+
private Module getModuleFromPOM(File pom) {
351+
try {
352+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
353+
factory.setIgnoringElementContentWhitespace(true);
354+
DocumentBuilder builder = factory.newDocumentBuilder();
355+
Document doc = builder.parse(pom);
356+
357+
String groupId = doc.getElementsByTagName("groupId").item(0).getFirstChild().getTextContent();
358+
String artifactId = doc.getElementsByTagName("artifactId").item(0).getFirstChild().getTextContent();
359+
360+
return new Module(groupId, artifactId);
361+
} catch (ParserConfigurationException | IOException | SAXException e) {
362+
throw new RuntimeException("Cannot get maven coordinates from " + pom.getPath() + ". Reason: " + e.getMessage());
363+
}
364+
}
365+
313366
private static final class Module {
314367
private final String groupId;
315368
private final String artifactId;

0 commit comments

Comments
 (0)