From d9ba9b4e4d5d33b969f995672f63283ed0416f4b Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 28 Nov 2024 09:56:50 +0100 Subject: [PATCH 1/3] Make test independent of local Git repo config --- .../xml/OpenTestReportGeneratingListener.java | 16 ++++++++++++---- .../OpenTestReportGeneratingListenerTests.java | 6 +----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java index c7fbef603e88..ba18a68c128b 100644 --- a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java +++ b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java @@ -58,6 +58,7 @@ import java.net.UnknownHostException; import java.nio.charset.Charset; import java.nio.file.Path; +import java.nio.file.Paths; import java.time.Instant; import java.util.Map; import java.util.Optional; @@ -108,9 +109,16 @@ public class OpenTestReportGeneratingListener implements TestExecutionListener { private final AtomicInteger idCounter = new AtomicInteger(); private final Map inProgressIds = new ConcurrentHashMap<>(); private DocumentWriter eventsFileWriter = DocumentWriter.noop(); + private final Path workingDir; private Path outputDir; + @SuppressWarnings("unused") // Used via ServiceLoader public OpenTestReportGeneratingListener() { + this(Paths.get(".").toAbsolutePath()); + } + + OpenTestReportGeneratingListener(Path workingDir) { + this.workingDir = workingDir; } @Override @@ -160,7 +168,7 @@ private void reportInfrastructure() { }); } - private static void addGitInfo(Infrastructure infrastructure) { + private void addGitInfo(Infrastructure infrastructure) { boolean gitInstalled = exec("git", "--version").isPresent(); if (gitInstalled) { exec("git", "config", "--get", "remote.origin.url") // @@ -179,7 +187,7 @@ private static void addGitInfo(Infrastructure infrastructure) { } } - static Optional exec(String... args) { + Optional exec(String... args) { Process process = startProcess(args); @@ -211,10 +219,10 @@ private static BufferedReader newBufferedReader(InputStream stream) { return new BufferedReader(new InputStreamReader(stream, Charset.defaultCharset())); } - private static Process startProcess(String[] args) { + private Process startProcess(String[] command) { Process process; try { - process = Runtime.getRuntime().exec(args); + process = new ProcessBuilder().directory(workingDir.toFile()).command(command).start(); } catch (IOException e) { throw new UncheckedIOException("Failed to start process", e); diff --git a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java index cd7792776187..dc6c84291505 100644 --- a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java @@ -79,10 +79,6 @@ void writesValidXmlReport() throws Exception { ${xmlunit.ignore} ${xmlunit.ignore} - - ${xmlunit.ignore} - ${xmlunit.matchesRegex#[0-9a-f]{40}#} - ${xmlunit.ignore} @@ -137,7 +133,7 @@ private void executeTests(TestEngine engine) { .configurationParameter(OUTPUT_DIR_PROPERTY_NAME, tempDirectory.resolve("junit-" + OUTPUT_DIR_UNIQUE_NUMBER_PLACEHOLDER).toString()) // .build(); - createLauncher(engine).execute(build, new OpenTestReportGeneratingListener()); + createLauncher(engine).execute(build, new OpenTestReportGeneratingListener(tempDirectory)); } } From 6eea108bc2ca72ab880d21f1f416dc26af5558a1 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 28 Nov 2024 10:17:29 +0100 Subject: [PATCH 2/3] Move ProcessStarter to separate source set to allow reuse --- platform-tests/platform-tests.gradle.kts | 38 ++++++++++++++++++- .../tests}/process/ProcessResult.java | 2 +- .../tests}/process/ProcessStarter.java | 2 +- .../tests}/process/WatchedOutput.java | 2 +- .../tests}/process/WatchedProcess.java | 2 +- .../platform/tests}/process/package-info.java | 2 +- .../platform-tooling-support-tests.gradle.kts | 8 ++-- .../{process => }/ProcessStarters.java | 5 +-- .../support/tests/AntStarterTests.java | 2 +- .../support/tests/GraalVmStarterTests.java | 2 +- .../tests/GradleKotlinExtensionsTests.java | 2 +- .../tests/GradleMissingEngineTests.java | 2 +- .../support/tests/GradleStarterTests.java | 2 +- .../support/tests/JarDescribeModuleTests.java | 2 +- .../support/tests/JavaVersionsTests.java | 4 +- .../support/tests/MavenStarterTests.java | 2 +- .../MavenSurefireCompatibilityTests.java | 2 +- .../support/tests/ModularUserGuideTests.java | 2 +- .../support/tests/MultiReleaseJarTests.java | 2 +- .../tests/ReflectionCompatibilityTests.java | 2 +- .../support/tests/StandaloneTests.java | 4 +- .../tests/VintageGradleIntegrationTests.java | 4 +- .../tests/VintageMavenIntegrationTests.java | 4 +- 23 files changed, 68 insertions(+), 31 deletions(-) rename {platform-tooling-support-tests/src/main/java/platform/tooling/support => platform-tests/src/processStarter/java/org/junit/platform/tests}/process/ProcessResult.java (93%) rename {platform-tooling-support-tests/src/main/java/platform/tooling/support => platform-tests/src/processStarter/java/org/junit/platform/tests}/process/ProcessStarter.java (98%) rename {platform-tooling-support-tests/src/main/java/platform/tooling/support => platform-tests/src/processStarter/java/org/junit/platform/tests}/process/WatchedOutput.java (93%) rename {platform-tooling-support-tests/src/main/java/platform/tooling/support => platform-tests/src/processStarter/java/org/junit/platform/tests}/process/WatchedProcess.java (96%) rename {platform-tooling-support-tests/src/main/java/platform/tooling/support => platform-tests/src/processStarter/java/org/junit/platform/tests}/process/package-info.java (61%) rename platform-tooling-support-tests/src/main/java/platform/tooling/support/{process => }/ProcessStarters.java (96%) diff --git a/platform-tests/platform-tests.gradle.kts b/platform-tests/platform-tests.gradle.kts index d5e7467c401e..cd4c8711fb40 100644 --- a/platform-tests/platform-tests.gradle.kts +++ b/platform-tests/platform-tests.gradle.kts @@ -1,3 +1,5 @@ + +import junitbuild.extensions.capitalized import org.gradle.api.tasks.PathSensitivity.NONE import org.gradle.api.tasks.PathSensitivity.RELATIVE import org.gradle.internal.os.OperatingSystem @@ -9,6 +11,18 @@ plugins { id("junitbuild.jmh-conventions") } +val processStarter by sourceSets.creating { + java { + srcDir("src/processStarter/java") + } +} + +java { + registerFeature(processStarter.name) { + usingSourceSet(processStarter) + } +} + dependencies { // --- Things we are testing -------------------------------------------------- testImplementation(projects.junitPlatformCommons) @@ -37,6 +51,11 @@ dependencies { testImplementation(libs.bundles.xmlunit) testImplementation(testFixtures(projects.junitJupiterApi)) testImplementation(testFixtures(projects.junitPlatformReporting)) + testImplementation(projects.platformTests) { + capabilities { + requireFeature("process-starter") + } + } // --- Test run-time dependencies --------------------------------------------- testRuntimeOnly(projects.junitVintageEngine) @@ -44,9 +63,20 @@ dependencies { because("`ReflectionUtilsTests.findNestedClassesWithInvalidNestedClassFile` needs it") } - // --- https://openjdk.java.net/projects/code-tools/jmh/ ----------------------- + // --- https://openjdk.java.net/projects/code-tools/jmh/ ---------------------- jmh(projects.junitJupiterApi) jmh(libs.junit4) + + // --- ProcessStarter dependencies -------------------------------------------- + processStarter.implementationConfigurationName(libs.groovy4) { + because("it provides convenience methods to handle process output") + } + processStarter.implementationConfigurationName(libs.commons.io) { + because("it uses TeeOutputStream") + } + processStarter.implementationConfigurationName(libs.opentest4j) { + because("it throws TestAbortedException") + } } jmh { @@ -80,6 +110,12 @@ tasks { includeTags("junit4") } } + named(processStarter.compileJavaTaskName).configure { + options.release = 21 + } + named("checkstyle${processStarter.name.capitalized()}").configure { + config = resources.text.fromFile(checkstyle.configDirectory.file("checkstyleMain.xml")) + } } eclipse { diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessResult.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessResult.java similarity index 93% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessResult.java rename to platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessResult.java index b69ecc77b5f1..9c018e7aaf79 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessResult.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessResult.java @@ -8,7 +8,7 @@ * https://www.eclipse.org/legal/epl-v20.html */ -package platform.tooling.support.process; +package org.junit.platform.tests.process; import java.util.List; diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarter.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java similarity index 98% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarter.java rename to platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java index 519b2d601b57..a7ad54a3fd7d 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarter.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java @@ -8,7 +8,7 @@ * https://www.eclipse.org/legal/epl-v20.html */ -package platform.tooling.support.process; +package org.junit.platform.tests.process; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedOutput.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedOutput.java similarity index 93% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedOutput.java rename to platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedOutput.java index 67019b147688..47cf7e5c2c12 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedOutput.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedOutput.java @@ -8,7 +8,7 @@ * https://www.eclipse.org/legal/epl-v20.html */ -package platform.tooling.support.process; +package org.junit.platform.tests.process; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedProcess.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedProcess.java similarity index 96% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedProcess.java rename to platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedProcess.java index 4b41d100e404..4bf675244197 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/WatchedProcess.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/WatchedProcess.java @@ -8,7 +8,7 @@ * https://www.eclipse.org/legal/epl-v20.html */ -package platform.tooling.support.process; +package org.junit.platform.tests.process; public class WatchedProcess { diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/package-info.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/package-info.java similarity index 61% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/package-info.java rename to platform-tests/src/processStarter/java/org/junit/platform/tests/process/package-info.java index 27abc7fb7956..35d962f9c545 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/package-info.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/package-info.java @@ -4,4 +4,4 @@ * @since 1.12 */ -package platform.tooling.support.process; +package org.junit.platform.tests.process; diff --git a/platform-tooling-support-tests/platform-tooling-support-tests.gradle.kts b/platform-tooling-support-tests/platform-tooling-support-tests.gradle.kts index 552dd30f0912..88f991589508 100644 --- a/platform-tooling-support-tests/platform-tooling-support-tests.gradle.kts +++ b/platform-tooling-support-tests/platform-tooling-support-tests.gradle.kts @@ -47,11 +47,13 @@ dependencies { implementation(libs.commons.io) { because("moving/deleting directory trees") } - implementation(libs.groovy4) { - because("it provides convenience methods to handle process output") + implementation(projects.platformTests) { + capabilities { + requireFeature("process-starter") + } } implementation(projects.junitJupiterApi) { - because("it throws TestAbortedException to abort tests and uses the OS enum") + because("it uses the OS enum to support Windows") } testImplementation(libs.archunit) { diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarters.java b/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java similarity index 96% rename from platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarters.java rename to platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java index 27c78accc9ce..52a73ea8e6dc 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/process/ProcessStarters.java +++ b/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java @@ -8,16 +8,15 @@ * https://www.eclipse.org/legal/epl-v20.html */ -package platform.tooling.support.process; +package platform.tooling.support; import java.nio.file.Path; import java.util.Optional; import org.junit.jupiter.api.condition.OS; +import org.junit.platform.tests.process.ProcessStarter; import org.opentest4j.TestAbortedException; -import platform.tooling.support.Helper; - public class ProcessStarters { public static ProcessStarter java() { diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/AntStarterTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/AntStarterTests.java index 331a423210a3..b57d24f4f272 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/AntStarterTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/AntStarterTests.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.io.TempDir; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GraalVmStarterTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GraalVmStarterTests.java index 0a32046ba9ab..b9f76e059010 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GraalVmStarterTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GraalVmStarterTests.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.io.TempDir; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.9.1 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleKotlinExtensionsTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleKotlinExtensionsTests.java index f3f05d27a7e3..042a06b066cc 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleKotlinExtensionsTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleKotlinExtensionsTests.java @@ -22,7 +22,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleMissingEngineTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleMissingEngineTests.java index 4c685ba56553..6c51f84c5f71 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleMissingEngineTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleMissingEngineTests.java @@ -23,7 +23,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleStarterTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleStarterTests.java index 8ca672d197bb..e2d9297dbd2a 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleStarterTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GradleStarterTests.java @@ -24,7 +24,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JarDescribeModuleTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JarDescribeModuleTests.java index 1f4df71f454b..3bb8ca941ade 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JarDescribeModuleTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JarDescribeModuleTests.java @@ -24,7 +24,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JavaVersionsTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JavaVersionsTests.java index 487580ba1f02..bd487d2289aa 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JavaVersionsTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JavaVersionsTests.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assumptions.assumeTrue; -import static platform.tooling.support.process.ProcessStarters.currentJdkHome; +import static platform.tooling.support.ProcessStarters.currentJdkHome; import static platform.tooling.support.tests.Projects.copyToWorkspace; import java.nio.file.Path; @@ -25,7 +25,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.4 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenStarterTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenStarterTests.java index 6d1d30f7c8ad..88022bd095fd 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenStarterTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenStarterTests.java @@ -24,7 +24,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.3 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenSurefireCompatibilityTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenSurefireCompatibilityTests.java index 56258a919186..59baf7e3d9e8 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenSurefireCompatibilityTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenSurefireCompatibilityTests.java @@ -25,7 +25,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.9.2 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java index 228d287c2c62..7aa591963757 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java @@ -33,8 +33,8 @@ import org.junit.platform.launcher.LauncherConstants; import platform.tooling.support.MavenRepo; +import platform.tooling.support.ProcessStarters; import platform.tooling.support.ThirdPartyJars; -import platform.tooling.support.process.ProcessStarters; /** * @since 1.5 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MultiReleaseJarTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MultiReleaseJarTests.java index 4647adc2bc2f..6f6ea1112d8c 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MultiReleaseJarTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MultiReleaseJarTests.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.io.TempDir; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.4 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ReflectionCompatibilityTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ReflectionCompatibilityTests.java index 89bed056c907..993e8e6012eb 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ReflectionCompatibilityTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ReflectionCompatibilityTests.java @@ -23,7 +23,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; /** * @since 1.11 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/StandaloneTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/StandaloneTests.java index fa99a9d53e6f..20596d164e35 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/StandaloneTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/StandaloneTests.java @@ -37,13 +37,13 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.parallel.Execution; +import org.junit.platform.tests.process.ProcessResult; import org.opentest4j.TestAbortedException; import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; +import platform.tooling.support.ProcessStarters; import platform.tooling.support.ThirdPartyJars; -import platform.tooling.support.process.ProcessResult; -import platform.tooling.support.process.ProcessStarters; /** * @since 1.4 diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageGradleIntegrationTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageGradleIntegrationTests.java index 89ccd6e220d0..e6088c074900 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageGradleIntegrationTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageGradleIntegrationTests.java @@ -19,12 +19,12 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.junit.platform.tests.process.ProcessResult; import org.opentest4j.TestAbortedException; import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessResult; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; class VintageGradleIntegrationTests { diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageMavenIntegrationTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageMavenIntegrationTests.java index e7d5788fc4be..79a7968131aa 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageMavenIntegrationTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageMavenIntegrationTests.java @@ -19,12 +19,12 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.junit.platform.tests.process.ProcessResult; import org.opentest4j.TestAbortedException; import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; -import platform.tooling.support.process.ProcessResult; -import platform.tooling.support.process.ProcessStarters; +import platform.tooling.support.ProcessStarters; class VintageMavenIntegrationTests { From 6294364a5c3eef5c01e5591bb95a99fe2bb3eb42 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 28 Nov 2024 11:20:22 +0100 Subject: [PATCH 3/3] Add tests for Git info in Open Test Reporting XML output --- .../tests/process/ProcessStarter.java | 2 +- ...OpenTestReportGeneratingListenerTests.java | 95 ++++++++++++++++--- .../tooling/support/ProcessStarters.java | 4 +- 3 files changed, 85 insertions(+), 16 deletions(-) diff --git a/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java index a7ad54a3fd7d..329f1fab138f 100644 --- a/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java +++ b/platform-tests/src/processStarter/java/org/junit/platform/tests/process/ProcessStarter.java @@ -67,7 +67,7 @@ public ProcessResult startAndWait() throws InterruptedException { } public WatchedProcess start() { - var command = Stream.concat(Stream.of(executable.toAbsolutePath().toString()), arguments.stream()).toList(); + var command = Stream.concat(Stream.of(executable.toString()), arguments.stream()).toList(); try { var builder = new ProcessBuilder().command(command); if (workingDir != null) { diff --git a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java index dc6c84291505..4d1f9ebda5c5 100644 --- a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java @@ -12,8 +12,9 @@ import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.io.CleanupMode.ON_SUCCESS; +import static org.junit.jupiter.api.Assumptions.assumeTrue; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUniqueId; import static org.junit.platform.launcher.LauncherConstants.OUTPUT_DIR_PROPERTY_NAME; import static org.junit.platform.launcher.LauncherConstants.OUTPUT_DIR_UNIQUE_NUMBER_PLACEHOLDER; @@ -23,15 +24,21 @@ import static org.junit.platform.reporting.testutil.FileUtils.findPath; import java.net.URISyntaxException; +import java.nio.file.Files; import java.nio.file.Path; -import java.util.regex.Pattern; +import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.junit.platform.engine.TestEngine; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.reporting.ReportEntry; import org.junit.platform.engine.support.hierarchical.DemoHierarchicalTestEngine; +import org.junit.platform.tests.process.ProcessResult; +import org.junit.platform.tests.process.ProcessStarter; +import org.opentest4j.reporting.schema.Namespace; import org.opentest4j.reporting.tooling.core.validator.DefaultValidator; import org.opentest4j.reporting.tooling.core.validator.ValidationResult; import org.xmlunit.assertj3.XmlAssert; @@ -44,11 +51,8 @@ */ public class OpenTestReportGeneratingListenerTests { - @TempDir(cleanup = ON_SUCCESS) - Path tempDirectory; - @Test - void writesValidXmlReport() throws Exception { + void writesValidXmlReport(@TempDir Path tempDirectory) throws Exception { var engine = new DemoHierarchicalTestEngine("dummy"); engine.addTest("failingTest", "display<-->Name 😎", (context, descriptor) -> { var listener = context.request.getEngineExecutionListener(); @@ -56,7 +60,7 @@ void writesValidXmlReport() throws Exception { fail("failure message"); }); - executeTests(engine); + executeTests(tempDirectory, engine, tempDirectory.resolve("junit-" + OUTPUT_DIR_UNIQUE_NUMBER_PLACEHOLDER)); var xmlFile = findPath(tempDirectory, "glob:**/open-test-report.xml"); assertThat(tempDirectory.relativize(xmlFile).toString()) // @@ -104,7 +108,7 @@ void writesValidXmlReport() throws Exception { - ${xmlunit.matchesRegex#org\\.opentest4j\\.AssertionFailedError: failure message#} + ${xmlunit.matchesRegex(org\\.opentest4j\\.AssertionFailedError: failure message)} @@ -115,23 +119,88 @@ void writesValidXmlReport() throws Exception { """; XmlAssert.assertThat(xmlFile).and(expected) // - .withDifferenceEvaluator(new PlaceholderDifferenceEvaluator(Pattern.quote("${"), Pattern.quote("}"), - Pattern.quote("#"), Pattern.quote("#"), ",")) // + .withDifferenceEvaluator(new PlaceholderDifferenceEvaluator()) // .ignoreWhitespace() // .areIdentical(); } + @ParameterizedTest + @ValueSource(strings = { "https://github.com/junit-team/junit5.git", "git@github.com:junit-team/junit5.git" }) + void includesGitInfo(String originUrl, @TempDir Path tempDirectory) throws Exception { + + assumeTrue(tryExecGit(tempDirectory, "--version").exitCode() == 0, "git not installed"); + execGit(tempDirectory, "init", "--initial-branch=my_branch"); + execGit(tempDirectory, "remote", "add", "origin", originUrl); + + Files.writeString(tempDirectory.resolve("README.md"), "Hello, world!"); + execGit(tempDirectory, "add", "."); + + execGit(tempDirectory, "config", "user.name", "Alice"); + execGit(tempDirectory, "config", "user.email", "alice@example.org"); + execGit(tempDirectory, "commit", "-m", "Initial commit"); + + var engine = new DemoHierarchicalTestEngine("dummy"); + + executeTests(tempDirectory, engine, tempDirectory.resolve("junit-reports")); + + var xmlFile = findPath(tempDirectory, "glob:**/open-test-report.xml"); + assertThat(validate(xmlFile)).isEmpty(); + + var namespaceContext = Map.of("core", Namespace.REPORTING_CORE.getUri(), "e", + Namespace.REPORTING_EVENTS.getUri(), "git", Namespace.REPORTING_GIT.getUri()); + + XmlAssert.assertThat(xmlFile) // + .withNamespaceContext(namespaceContext) // + .valueByXPath("/e:events/core:infrastructure/git:repository/@originUrl") // + .isEqualTo(originUrl); + + XmlAssert.assertThat(xmlFile) // + .withNamespaceContext(namespaceContext) // + .valueByXPath("/e:events/core:infrastructure/git:branch") // + .isEqualTo("my_branch"); + + var commitHash = execGit(tempDirectory, "rev-parse", "--verify", "HEAD").stdOut().trim(); + XmlAssert.assertThat(xmlFile) // + .withNamespaceContext(namespaceContext) // + .valueByXPath("/e:events/core:infrastructure/git:commit") // + .isEqualTo(commitHash); + + XmlAssert.assertThat(xmlFile) // + .withNamespaceContext(namespaceContext) // + .valueByXPath("/e:events/core:infrastructure/git:status/@clean") // + .isEqualTo(false); + + XmlAssert.assertThat(xmlFile) // + .withNamespaceContext(namespaceContext) // + .valueByXPath("/e:events/core:infrastructure/git:status") // + .startsWith("?? junit-reports"); + } + + private static ProcessResult execGit(Path workingDir, String... arguments) throws InterruptedException { + var result = tryExecGit(workingDir, arguments); + assertEquals(0, result.exitCode(), "git " + String.join(" ", arguments) + " failed"); + return result; + } + + private static ProcessResult tryExecGit(Path workingDir, String... arguments) throws InterruptedException { + System.out.println("$ git " + String.join(" ", arguments)); + return new ProcessStarter() // + .executable(Path.of("git")) // + .workingDir(workingDir) // + .addArguments(arguments) // + .startAndWait(); + } + private ValidationResult validate(Path xmlFile) throws URISyntaxException { var catalogUri = requireNonNull(getClass().getResource("catalog.xml")).toURI(); return new DefaultValidator(catalogUri).validate(xmlFile); } - private void executeTests(TestEngine engine) { + private void executeTests(Path tempDirectory, TestEngine engine, Path outputDir) { var build = request() // .selectors(selectUniqueId(UniqueId.forEngine(engine.getId()))) // .configurationParameter(ENABLED_PROPERTY_NAME, String.valueOf(true)) // - .configurationParameter(OUTPUT_DIR_PROPERTY_NAME, - tempDirectory.resolve("junit-" + OUTPUT_DIR_UNIQUE_NUMBER_PLACEHOLDER).toString()) // + .configurationParameter(OUTPUT_DIR_PROPERTY_NAME, outputDir.toString()) // .build(); createLauncher(engine).execute(build, new OpenTestReportGeneratingListener(tempDirectory)); } diff --git a/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java b/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java index 52a73ea8e6dc..2fa7e4c94e70 100644 --- a/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java +++ b/platform-tooling-support-tests/src/main/java/platform/tooling/support/ProcessStarters.java @@ -45,7 +45,7 @@ public static ProcessStarter javaCommand(Path javaHome, String commandName) { public static ProcessStarter gradlew() { return new ProcessStarter() // - .executable(Path.of("..").resolve(windowsOrOtherExecutable("gradlew.bat", "gradlew"))) // + .executable(Path.of("..").resolve(windowsOrOtherExecutable("gradlew.bat", "gradlew")).toAbsolutePath()) // .putEnvironment("JAVA_HOME", getGradleJavaHome().orElseThrow(TestAbortedException::new)) // .addArguments("-PjupiterVersion=" + Helper.version("junit-jupiter")) // .addArguments("-PvintageVersion=" + Helper.version("junit-vintage")) // @@ -55,7 +55,7 @@ public static ProcessStarter gradlew() { public static ProcessStarter maven() { return new ProcessStarter() // .executable(Path.of(System.getProperty("mavenDistribution")).resolve("bin").resolve( - windowsOrOtherExecutable("mvn.cmd", "mvn"))) // + windowsOrOtherExecutable("mvn.cmd", "mvn")).toAbsolutePath()) // .addArguments("-Djunit.jupiter.version=" + Helper.version("junit-jupiter")) // .addArguments("-Djunit.bom.version=" + Helper.version("junit-jupiter")) // .addArguments("-Djunit.vintage.version=" + Helper.version("junit-vintage")) //