From a2e160a8511fdaab746e09255fa6bae303013314 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 14 Nov 2024 12:16:59 +0100 Subject: [PATCH 1/8] Include Git metadata in Open Test Report XML output --- .../xml/OpenTestReportGeneratingListener.java | 101 +++++++++++++++++- ...OpenTestReportGeneratingListenerTests.java | 11 +- .../tooling/support/tests/XmlAssertions.java | 7 +- 3 files changed, 115 insertions(+), 4 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 dbb5541e9ce3..898a2a203ab5 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 @@ -11,6 +11,7 @@ package org.junit.platform.reporting.open.xml; import static org.apiguardian.api.API.Status.EXPERIMENTAL; +import static org.junit.platform.commons.util.StringUtils.isNotBlank; import static org.junit.platform.reporting.open.xml.JUnitFactory.legacyReportingName; import static org.junit.platform.reporting.open.xml.JUnitFactory.type; import static org.junit.platform.reporting.open.xml.JUnitFactory.uniqueId; @@ -30,6 +31,10 @@ import static org.opentest4j.reporting.events.core.CoreFactory.tags; import static org.opentest4j.reporting.events.core.CoreFactory.uriSource; import static org.opentest4j.reporting.events.core.CoreFactory.userName; +import static org.opentest4j.reporting.events.git.GitFactory.branch; +import static org.opentest4j.reporting.events.git.GitFactory.commit; +import static org.opentest4j.reporting.events.git.GitFactory.repository; +import static org.opentest4j.reporting.events.git.GitFactory.status; import static org.opentest4j.reporting.events.java.JavaFactory.classSource; import static org.opentest4j.reporting.events.java.JavaFactory.classpathResourceSource; import static org.opentest4j.reporting.events.java.JavaFactory.fileEncoding; @@ -42,18 +47,27 @@ import static org.opentest4j.reporting.events.root.RootFactory.reported; import static org.opentest4j.reporting.events.root.RootFactory.started; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.io.UncheckedIOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.nio.file.Path; import java.time.Instant; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; import org.apiguardian.api.API; import org.junit.platform.commons.JUnitException; +import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.commons.util.StringUtils; import org.junit.platform.engine.ConfigurationParameters; import org.junit.platform.engine.TestExecutionResult; @@ -74,6 +88,7 @@ import org.junit.platform.launcher.listeners.OutputDir; import org.opentest4j.reporting.events.api.DocumentWriter; import org.opentest4j.reporting.events.api.NamespaceRegistry; +import org.opentest4j.reporting.events.core.Infrastructure; import org.opentest4j.reporting.events.core.Result; import org.opentest4j.reporting.events.core.Sources; import org.opentest4j.reporting.events.root.Events; @@ -103,6 +118,7 @@ public void testPlanExecutionStarted(TestPlan testPlan) { if (isEnabled(config)) { NamespaceRegistry namespaceRegistry = NamespaceRegistry.builder(Namespace.REPORTING_CORE) // .add("e", Namespace.REPORTING_EVENTS) // + .add("git", Namespace.REPORTING_GIT) // .add("java", Namespace.REPORTING_JAVA) // .add("junit", JUnitFactory.NAMESPACE, "https://junit.org/junit5/schemas/open-test-reporting/junit-1.9.xsd") // @@ -138,9 +154,92 @@ private void reportInfrastructure() { .append(javaVersion(System.getProperty("java.version"))) // .append(fileEncoding(System.getProperty("file.encoding"))) // .append(heapSize(), heapSize -> heapSize.withMax(Runtime.getRuntime().maxMemory())); + + addGitInfo(infrastructure); }); } + private static void addGitInfo(Infrastructure infrastructure) { + boolean gitInstalled = exec("git", "--version").isPresent(); + if (gitInstalled) { + exec("git", "config", "--get", "remote.origin.url") // + .filter(StringUtils::isNotBlank) // + .ifPresent( + gitUrl -> infrastructure.append(repository(), repository -> repository.withOriginUrl(gitUrl))); + exec("git", "rev-parse", "--abbrev-ref", "HEAD") // + .filter(StringUtils::isNotBlank) // + .ifPresent(branch -> infrastructure.append(branch(branch))); + exec("git", "rev-parse", "--verify", "HEAD") // + .filter(StringUtils::isNotBlank) // + .ifPresent(gitCommitHash -> infrastructure.append(commit(gitCommitHash))); + exec("git", "status", "--porcelain") // + .ifPresent(statusOutput -> infrastructure.append(status(statusOutput), + status -> status.withClean(statusOutput.isEmpty()))); + } + } + + static Optional exec(String... args) { + + Process process = startProcess(args); + + try (Reader out = newBufferedReader(process.getInputStream()); + Reader err = newBufferedReader(process.getErrorStream())) { + + StringBuilder output = new StringBuilder(); + readAllChars(out, (chars, numChars) -> output.append(chars, 0, numChars)); + + readAllChars(err, (__, ___) -> { + // ignore + }); + + boolean terminated = process.waitFor(10, TimeUnit.SECONDS); + return terminated && process.exitValue() == 0 ? Optional.of(trimAtEnd(output)) : Optional.empty(); + } + catch (InterruptedException e) { + throw ExceptionUtils.throwAsUncheckedException(e); + } + catch (IOException ignore) { + return Optional.empty(); + } + finally { + process.destroyForcibly(); + } + } + + private static BufferedReader newBufferedReader(InputStream stream) { + return new BufferedReader(new InputStreamReader(stream, Charset.defaultCharset())); + } + + private static Process startProcess(String[] args) { + Process process; + try { + process = Runtime.getRuntime().exec(args); + } + catch (IOException e) { + throw new RuntimeException(e); + } + return process; + } + + private static void readAllChars(Reader reader, BiConsumer consumer) throws IOException { + char[] buffer = new char[1024]; + int numChars; + while ((numChars = reader.read(buffer)) != -1) { + consumer.accept(buffer, numChars); + } + } + + private static String trimAtEnd(StringBuilder value) { + int endIndex = value.length(); + for (int i = value.length() - 1; i >= 0; i--) { + if (Character.isWhitespace(value.charAt(i))) { + endIndex--; + break; + } + } + return value.substring(0, endIndex); + } + @Override public void testPlanExecutionFinished(TestPlan testPlan) { try { @@ -160,7 +259,7 @@ public void executionSkipped(TestIdentifier testIdentifier, String reason) { reportStarted(testIdentifier, id); eventsFileWriter.append(finished(id, Instant.now()), // finished -> finished.append(result(Result.Status.SKIPPED), result -> { - if (StringUtils.isNotBlank(reason)) { + if (isNotBlank(reason)) { result.append(reason(reason)); } })); 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 946662eb3577..2c48f6feccf4 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 @@ -64,8 +64,11 @@ void writesValidXmlReport() throws Exception { assertThat(validate(xmlFile)).isEmpty(); var expected = """ - ${xmlunit.ignore} @@ -75,6 +78,10 @@ void writesValidXmlReport() throws Exception { ${xmlunit.ignore} ${xmlunit.ignore} + + ${xmlunit.ignore} + ${xmlunit.matchesRegex([0-9a-f]{40})} + ${xmlunit.ignore} diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/XmlAssertions.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/XmlAssertions.java index b233d6c0e9eb..7e0987860245 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/XmlAssertions.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/XmlAssertions.java @@ -34,7 +34,8 @@ static void verifyContainsExpectedStartedOpenTestReport(Path testResultsDir) { private static void verifyContent(Path xmlFile) { var expected = """ - @@ -45,6 +46,10 @@ private static void verifyContent(Path xmlFile) { ${xmlunit.ignore} ${xmlunit.ignore} + + ${xmlunit.ignore} + ${xmlunit.matchesRegex([0-9a-f]{40})} + ${xmlunit.ignore} From ed5e465b573e4ccf34f8104f106c63e4cf4a7994 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Thu, 14 Nov 2024 15:53:01 +0100 Subject: [PATCH 2/8] Add to release notes --- .../asciidoc/release-notes/release-notes-5.12.0-M1.adoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc index 0803439636db..b5aa3793f508 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc @@ -38,9 +38,11 @@ JUnit repository on GitHub. `--select-file` and `--select-resource`. * `ConsoleLauncher` now accepts multiple values for all `--select` options. * Add `--select-unique-id` support to ConsoleLauncher. -* The `junit-platform-reporting` module now contributes a section containing - JUnit-specific metadata about each test/container to the HTML report written by - open-test-reporting when added to the classpath/module path. +* The following improvements have been made to the open-test-reporting XML output: + - Information about the Git repository, the current branch, the commit hash, and the + current worktree status are now included in the XML report, if applicable. + - A section containing JUnit-specific metadata about each test/container to the HTML + report is now written by open-test-reporting when added to the classpath/module path [[release-notes-5.12.0-M1-junit-jupiter]] From 7480f15976c9a3e6709e287d3d1f4807e7f8f5da Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 14:09:08 +0100 Subject: [PATCH 3/8] Start Maven builds with empty local repo to avoid flakiness --- .../support/tests/JavaVersionsTests.java | 6 +- .../tooling/support/tests/LocalMavenRepo.java | 112 ++++++++++++++++++ .../support/tests/MavenStarterTests.java | 5 +- .../MavenSurefireCompatibilityTests.java | 6 +- .../support/tests/MultiReleaseJarTests.java | 6 +- .../tests/VintageMavenIntegrationTests.java | 6 +- 6 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java 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 d7785cd6e1ad..8a5caad44fb8 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 @@ -27,12 +27,16 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; +import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.4 */ class JavaVersionsTests { + @LocalMavenRepo + Directory localMavenRepo; + @Test void java_8() { var java8Home = Helper.getJavaHome("8"); @@ -54,7 +58,7 @@ List execute(String version, Path javaHome, Map environm .setTool(Request.maven()) // .setProject(Projects.JAVA_VERSIONS) // .setWorkspace("java-versions-" + version) // - .addArguments("-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // .addArguments("--update-snapshots", "--batch-mode", "verify") // .setTimeout(TOOL_TIMEOUT) // .setJavaHome(javaHome); diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java new file mode 100644 index 000000000000..892a766bf56d --- /dev/null +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java @@ -0,0 +1,112 @@ +/* + * Copyright 2015-2024 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * https://www.eclipse.org/legal/epl-v20.html + */ + +package platform.tooling.support.tests; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static org.junit.platform.commons.support.ReflectionSupport.streamFields; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ExtensionContext.Namespace; +import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; +import org.junit.platform.commons.support.AnnotationSupport; +import org.junit.platform.commons.support.HierarchyTraversalMode; +import org.junit.platform.commons.util.Preconditions; + +@Target({ ElementType.PARAMETER, ElementType.FIELD }) +@Retention(RUNTIME) +@ExtendWith(LocalMavenRepo.Extension.class) +public @interface LocalMavenRepo { + + class Extension implements ParameterResolver, TestInstancePostProcessor { + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return parameterContext.isAnnotated(LocalMavenRepo.class); + } + + @Override + public Directory resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + Preconditions.condition(Directory.class.equals(parameterContext.getParameter().getType()), + () -> "Parameter must be of type " + Directory.class + ": " + parameterContext.getParameter()); + return getOrCreateDirectory(extensionContext); + } + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext context) { + streamFields(testInstance.getClass(), field -> AnnotationSupport.isAnnotated(field, LocalMavenRepo.class), + HierarchyTraversalMode.BOTTOM_UP) // + .forEach(field -> { + Preconditions.condition(Directory.class.equals(field.getType()), + () -> "Field must be of type " + Directory.class + ": " + field); + try { + field.set(testInstance, getOrCreateDirectory(context)); + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + } + + private Directory getOrCreateDirectory(ExtensionContext extensionContext) { + return extensionContext.getRoot().getStore(Namespace.GLOBAL) // + .getOrComputeIfAbsent(Directory.class, __ -> new Directory(), Directory.class); + } + } + + class Directory implements CloseableResource { + + private final Path tempDir; + + private Directory() { + try { + tempDir = Files.createTempDirectory("local-maven-repo-"); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String toCliArgument() { + return "-Dmaven.repo.local=" + tempDir; + } + + @Override + public void close() throws Throwable { + try (var files = Files.walk(tempDir)) { + files.sorted(Comparator. naturalOrder().reversed()) // + .forEach(path -> { + try { + Files.delete(path); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + } + } +} 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 bf5b8a581437..2f72339a6501 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,6 +24,7 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; +import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.3 @@ -32,11 +33,11 @@ class MavenStarterTests { @ResourceLock(Projects.MAVEN_STARTER) @Test - void verifyMavenStarterProject() { + void verifyMavenStarterProject(@LocalMavenRepo Directory localMavenRepo) { var request = Request.builder() // .setTool(Request.maven()) // .setProject(Projects.MAVEN_STARTER) // - .addArguments("-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // .addArguments("--update-snapshots", "--batch-mode", "verify") // .setTimeout(TOOL_TIMEOUT) // .setJavaHome(Helper.getJavaHome("8").orElseThrow(TestAbortedException::new)) // 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 d0e20e1c450e..44dd974e2c42 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 @@ -27,12 +27,16 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; +import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.9.2 */ class MavenSurefireCompatibilityTests { + @LocalMavenRepo + Directory localMavenRepo; + @ResourceLock(Projects.MAVEN_SUREFIRE_COMPATIBILITY) @ParameterizedTest @CsvSource(delimiter = '|', nullValues = "", textBlock = """ @@ -44,7 +48,7 @@ void testMavenSurefireCompatibilityProject(String surefireVersion, String extraA var request = Request.builder() // .setTool(Request.maven()) // .setProject(Projects.MAVEN_SUREFIRE_COMPATIBILITY) // - .addArguments("-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // .addArguments("-Dsurefire.version=" + surefireVersion) // .addArguments("--update-snapshots", "--batch-mode", "test") // .addArguments(extraArgs) // 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 33105f0983f4..679d6924f860 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 @@ -28,12 +28,16 @@ import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; +import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.4 */ class MultiReleaseJarTests { + @LocalMavenRepo + Directory localMavenRepo; + @ResourceLock(Projects.MULTI_RELEASE_JAR) @Test void checkDefault() throws Exception { @@ -88,7 +92,7 @@ private Result mvn(String variant) { var builder = Request.builder() // .setTool(Request.maven()) // .setProject(Projects.MULTI_RELEASE_JAR) // - .addArguments("-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // .addArguments("--update-snapshots", "--show-version", "--errors", "--batch-mode", "--file", variant, "test") // .setTimeout(TOOL_TIMEOUT); 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 398c5a13ff03..c6023920830d 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 @@ -24,9 +24,13 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; +import platform.tooling.support.tests.LocalMavenRepo.Directory; class VintageMavenIntegrationTests { + @LocalMavenRepo + Directory localMavenRepo; + @Test void unsupportedVersion() { var result = run("4.11"); @@ -61,7 +65,7 @@ private Result run(String version) { .setProject(Projects.VINTAGE) // .setWorkspace("vintage-maven-" + version) // .addArguments("clean", "test", "--update-snapshots", "--batch-mode") // - .addArguments("-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // .addArguments("-Djunit4Version=" + version) // .setTimeout(TOOL_TIMEOUT) // .build() // From 73cc65ae4854a15b36c47f6b97aac266f809ada7 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 17:04:42 +0100 Subject: [PATCH 4/8] Generalize resource management --- .../tooling/support/tests/GlobalResource.java | 93 +++++++++++++++ .../support/tests/JavaVersionsTests.java | 5 +- .../tooling/support/tests/LocalMavenRepo.java | 106 ++++-------------- .../support/tests/MavenStarterTests.java | 6 +- .../MavenSurefireCompatibilityTests.java | 5 +- .../support/tests/MultiReleaseJarTests.java | 5 +- .../tests/VintageMavenIntegrationTests.java | 5 +- 7 files changed, 127 insertions(+), 98 deletions(-) create mode 100644 platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GlobalResource.java diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GlobalResource.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GlobalResource.java new file mode 100644 index 000000000000..637a9abb7ac4 --- /dev/null +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/GlobalResource.java @@ -0,0 +1,93 @@ +/* + * Copyright 2015-2024 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * https://www.eclipse.org/legal/epl-v20.html + */ + +package platform.tooling.support.tests; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static org.junit.platform.commons.support.ReflectionSupport.streamFields; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ExtensionContext.Namespace; +import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; +import org.junit.platform.commons.support.AnnotationSupport; +import org.junit.platform.commons.support.HierarchyTraversalMode; +import org.junit.platform.commons.support.ReflectionSupport; +import org.junit.platform.commons.util.Preconditions; + +@Target({ ElementType.PARAMETER, ElementType.FIELD }) +@Retention(RUNTIME) +@ExtendWith(GlobalResource.Extension.class) +public @interface GlobalResource { + + class Extension implements ParameterResolver, TestInstancePostProcessor { + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return parameterContext.isAnnotated(GlobalResource.class); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + Class type = parameterContext.getParameter().getType(); + return getOrCreateResource(extensionContext, type).get(); + } + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext extensionContext) { + streamFields(testInstance.getClass(), field -> AnnotationSupport.isAnnotated(field, GlobalResource.class), + HierarchyTraversalMode.BOTTOM_UP) // + .forEach(field -> { + try { + field.set(testInstance, getOrCreateResource(extensionContext, field.getType()).get()); + } + catch (IllegalAccessException e) { + throw new RuntimeException("Failed to inject resource into field: " + field, e); + } + }); + } + + @SuppressWarnings("unchecked") + private Resource getOrCreateResource(ExtensionContext extensionContext, Class type) { + return extensionContext.getRoot().getStore(Namespace.GLOBAL) // + .getOrComputeIfAbsent(type, Resource::new, Resource.class); + } + } + + class Resource implements CloseableResource { + + private final T value; + + private Resource(Class type) { + Preconditions.condition(AutoCloseable.class.isAssignableFrom(type), + () -> "Resource type must implement AutoCloseable: " + type.getName()); + this.value = ReflectionSupport.newInstance(type); + } + + private T get() { + return value; + } + + @Override + public void close() throws Throwable { + ((AutoCloseable) value).close(); + } + } +} 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 8a5caad44fb8..12528bddb994 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 @@ -27,15 +27,14 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; -import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.4 */ class JavaVersionsTests { - @LocalMavenRepo - Directory localMavenRepo; + @GlobalResource + LocalMavenRepo localMavenRepo; @Test void java_8() { diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java index 892a766bf56d..614caa229137 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java @@ -10,103 +10,41 @@ package platform.tooling.support.tests; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import static org.junit.platform.commons.support.ReflectionSupport.streamFields; - import java.io.IOException; import java.io.UncheckedIOException; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ExtensionContext.Namespace; -import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.ParameterResolver; -import org.junit.jupiter.api.extension.TestInstancePostProcessor; -import org.junit.platform.commons.support.AnnotationSupport; -import org.junit.platform.commons.support.HierarchyTraversalMode; -import org.junit.platform.commons.util.Preconditions; - -@Target({ ElementType.PARAMETER, ElementType.FIELD }) -@Retention(RUNTIME) -@ExtendWith(LocalMavenRepo.Extension.class) -public @interface LocalMavenRepo { +public class LocalMavenRepo implements AutoCloseable { - class Extension implements ParameterResolver, TestInstancePostProcessor { - - @Override - public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) - throws ParameterResolutionException { - return parameterContext.isAnnotated(LocalMavenRepo.class); - } + private final Path tempDir; - @Override - public Directory resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) - throws ParameterResolutionException { - Preconditions.condition(Directory.class.equals(parameterContext.getParameter().getType()), - () -> "Parameter must be of type " + Directory.class + ": " + parameterContext.getParameter()); - return getOrCreateDirectory(extensionContext); + public LocalMavenRepo() { + try { + tempDir = Files.createTempDirectory("local-maven-repo-"); } - - @Override - public void postProcessTestInstance(Object testInstance, ExtensionContext context) { - streamFields(testInstance.getClass(), field -> AnnotationSupport.isAnnotated(field, LocalMavenRepo.class), - HierarchyTraversalMode.BOTTOM_UP) // - .forEach(field -> { - Preconditions.condition(Directory.class.equals(field.getType()), - () -> "Field must be of type " + Directory.class + ": " + field); - try { - field.set(testInstance, getOrCreateDirectory(context)); - } - catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - }); - } - - private Directory getOrCreateDirectory(ExtensionContext extensionContext) { - return extensionContext.getRoot().getStore(Namespace.GLOBAL) // - .getOrComputeIfAbsent(Directory.class, __ -> new Directory(), Directory.class); + catch (IOException e) { + throw new RuntimeException(e); } } - class Directory implements CloseableResource { - - private final Path tempDir; - - private Directory() { - try { - tempDir = Files.createTempDirectory("local-maven-repo-"); - } - catch (IOException e) { - throw new RuntimeException(e); - } - } - - public String toCliArgument() { - return "-Dmaven.repo.local=" + tempDir; - } + public String toCliArgument() { + return "-Dmaven.repo.local=" + tempDir; + } - @Override - public void close() throws Throwable { - try (var files = Files.walk(tempDir)) { - files.sorted(Comparator. naturalOrder().reversed()) // - .forEach(path -> { - try { - Files.delete(path); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - }); - } + @Override + public void close() throws IOException { + try (var files = Files.walk(tempDir)) { + files.sorted(Comparator. naturalOrder().reversed()) // + .forEach(path -> { + try { + Files.delete(path); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + }); } } } 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 2f72339a6501..b335636e29ad 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,16 +24,18 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; -import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.3 */ class MavenStarterTests { + @GlobalResource + LocalMavenRepo localMavenRepo; + @ResourceLock(Projects.MAVEN_STARTER) @Test - void verifyMavenStarterProject(@LocalMavenRepo Directory localMavenRepo) { + void verifyMavenStarterProject() { var request = Request.builder() // .setTool(Request.maven()) // .setProject(Projects.MAVEN_STARTER) // 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 44dd974e2c42..4188637a2744 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 @@ -27,15 +27,14 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; -import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.9.2 */ class MavenSurefireCompatibilityTests { - @LocalMavenRepo - Directory localMavenRepo; + @GlobalResource + LocalMavenRepo localMavenRepo; @ResourceLock(Projects.MAVEN_SUREFIRE_COMPATIBILITY) @ParameterizedTest 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 679d6924f860..3e100255b26b 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 @@ -28,15 +28,14 @@ import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; -import platform.tooling.support.tests.LocalMavenRepo.Directory; /** * @since 1.4 */ class MultiReleaseJarTests { - @LocalMavenRepo - Directory localMavenRepo; + @GlobalResource + LocalMavenRepo localMavenRepo; @ResourceLock(Projects.MULTI_RELEASE_JAR) @Test 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 c6023920830d..217d40e1bbd0 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 @@ -24,12 +24,11 @@ import platform.tooling.support.Helper; import platform.tooling.support.MavenRepo; import platform.tooling.support.Request; -import platform.tooling.support.tests.LocalMavenRepo.Directory; class VintageMavenIntegrationTests { - @LocalMavenRepo - Directory localMavenRepo; + @GlobalResource + LocalMavenRepo localMavenRepo; @Test void unsupportedVersion() { From c5ba2fbdb5bfdfd95e658e0d933f137aef333834 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 17:06:10 +0100 Subject: [PATCH 5/8] Add HTTP proxy for snapshot repo to forbid downloading JUnit artifacts --- .../projects/maven-starter/pom.xml | 4 +- .../multi-release-jar/default/pom.xml | 4 +- .../tooling/support/tests/MavenRepoProxy.java | 124 ++++++++++++++++++ .../support/tests/MavenStarterTests.java | 4 + .../support/tests/MultiReleaseJarTests.java | 4 + 5 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java diff --git a/platform-tooling-support-tests/projects/maven-starter/pom.xml b/platform-tooling-support-tests/projects/maven-starter/pom.xml index 367df2e0f09d..31aaf42dfffe 100644 --- a/platform-tooling-support-tests/projects/maven-starter/pom.xml +++ b/platform-tooling-support-tests/projects/maven-starter/pom.xml @@ -90,8 +90,8 @@ - sonatype-oss-snapshots - https://oss.sonatype.org/content/repositories/snapshots + snapshots-repo + ${snapshot.repo.url} true diff --git a/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml b/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml index 8c9478ffa825..3f99b08745cf 100644 --- a/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml +++ b/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml @@ -69,8 +69,8 @@ - sonatype-oss-snapshots - https://oss.sonatype.org/content/repositories/snapshots + snapshots-repo + ${snapshot.repo.url} true diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java new file mode 100644 index 000000000000..7f2326e0dd0a --- /dev/null +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java @@ -0,0 +1,124 @@ +/* + * Copyright 2015-2024 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * https://www.eclipse.org/legal/epl-v20.html + */ + +package platform.tooling.support.tests; + +import static java.net.http.HttpRequest.BodyPublishers.noBody; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.List; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; + +public class MavenRepoProxy implements AutoCloseable { + + // Forbid downloading JUnit artifacts since we want to use the local ones + private static final List FORBIDDEN_PATHS = List.of("/org/junit"); + + private static final List RESTRICTED_HEADER_NAMES = List.of("Connection", "Host"); + + private final HttpServer httpServer; + private final HttpClient httpClient; + + @SuppressWarnings("unused") + public MavenRepoProxy() throws IOException { + this(0); + } + + @SuppressWarnings("unused") + public MavenRepoProxy(int port) throws IOException { + this("https://oss.sonatype.org/content/repositories/snapshots", port); + } + + private MavenRepoProxy(String proxiedUrl, int port) throws IOException { + httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build(); + httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), port), 0); + httpServer.createContext("/", exchange -> { + try (exchange) { + switch (exchange.getRequestMethod()) { + case "HEAD": + case "GET": + if (FORBIDDEN_PATHS.stream().anyMatch( + it -> exchange.getRequestURI().getPath().startsWith(it))) { + exchange.sendResponseHeaders(404, 0); + break; + } + var request = mapRequest(proxiedUrl, exchange); + try { + var response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); + mapResponse(response, exchange); + } + catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + break; + default: + exchange.sendResponseHeaders(405, -1); + } + } + catch (Exception e) { + e.printStackTrace(); + } + }); + httpServer.start(); + } + + URI getBaseUri() { + var address = httpServer.getAddress(); + return URI.create("http://" + address.getAddress().getHostName() + ":" + address.getPort()); + } + + private static void mapResponse(HttpResponse response, HttpExchange exchange) throws IOException { + exchange.sendResponseHeaders(response.statusCode(), + response.headers().firstValueAsLong("Content-Length").orElse(0)); + response.headers().map().forEach((key, values) -> exchange.getResponseHeaders().put(key, values)); + try (InputStream body = response.body()) { + body.transferTo(exchange.getResponseBody()); + } + } + + private static HttpRequest mapRequest(String proxiedUrl, HttpExchange exchange) { + var request = HttpRequest.newBuilder().method(exchange.getRequestMethod(), noBody()) // + .uri(URI.create(proxiedUrl + exchange.getRequestURI().getPath())); + exchange.getRequestHeaders().entrySet().stream() // + .filter(entry -> RESTRICTED_HEADER_NAMES.stream().noneMatch(it -> it.equalsIgnoreCase(entry.getKey()))) // + .forEach(entry -> entry.getValue() // + .forEach(value -> request.header(entry.getKey(), value))); + return request.build(); + } + + @Override + public void close() { + assertAll( // + () -> assertDoesNotThrow(() -> httpServer.stop(0)), // + () -> assertDoesNotThrow(httpClient::close) // + ); + } + + @SuppressWarnings("unused") + public static void main(String[] args) throws Exception { + try (var proxy = new MavenRepoProxy(12345)) { + System.out.println("Started proxy: " + proxy.getBaseUri()); + while (!Thread.interrupted()) { + Thread.onSpinWait(); + } + } + } +} 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 b335636e29ad..d69df0020425 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 @@ -33,6 +33,9 @@ class MavenStarterTests { @GlobalResource LocalMavenRepo localMavenRepo; + @GlobalResource + MavenRepoProxy mavenRepoProxy; + @ResourceLock(Projects.MAVEN_STARTER) @Test void verifyMavenStarterProject() { @@ -40,6 +43,7 @@ void verifyMavenStarterProject() { .setTool(Request.maven()) // .setProject(Projects.MAVEN_STARTER) // .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments("-Dsnapshot.repo.url=" + mavenRepoProxy.getBaseUri()) // .addArguments("--update-snapshots", "--batch-mode", "verify") // .setTimeout(TOOL_TIMEOUT) // .setJavaHome(Helper.getJavaHome("8").orElseThrow(TestAbortedException::new)) // 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 3e100255b26b..434c4f6bfe53 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 @@ -37,6 +37,9 @@ class MultiReleaseJarTests { @GlobalResource LocalMavenRepo localMavenRepo; + @GlobalResource + MavenRepoProxy mavenRepoProxy; + @ResourceLock(Projects.MULTI_RELEASE_JAR) @Test void checkDefault() throws Exception { @@ -92,6 +95,7 @@ private Result mvn(String variant) { .setTool(Request.maven()) // .setProject(Projects.MULTI_RELEASE_JAR) // .addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) // + .addArguments("-Dsnapshot.repo.url=" + mavenRepoProxy.getBaseUri()) // .addArguments("--update-snapshots", "--show-version", "--errors", "--batch-mode", "--file", variant, "test") // .setTimeout(TOOL_TIMEOUT); From 21d988725316e767d24d243e89445f1479c7d7bd Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 17:12:22 +0100 Subject: [PATCH 6/8] Redirect instead of proxying --- .../tooling/support/tests/MavenRepoProxy.java | 59 ++----------------- 1 file changed, 5 insertions(+), 54 deletions(-) diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java index 7f2326e0dd0a..fa13d76b6ab5 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenRepoProxy.java @@ -10,21 +10,12 @@ package platform.tooling.support.tests; -import static java.net.http.HttpRequest.BodyPublishers.noBody; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - import java.io.IOException; -import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; import java.util.List; -import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; public class MavenRepoProxy implements AutoCloseable { @@ -32,10 +23,7 @@ public class MavenRepoProxy implements AutoCloseable { // Forbid downloading JUnit artifacts since we want to use the local ones private static final List FORBIDDEN_PATHS = List.of("/org/junit"); - private static final List RESTRICTED_HEADER_NAMES = List.of("Connection", "Host"); - private final HttpServer httpServer; - private final HttpClient httpClient; @SuppressWarnings("unused") public MavenRepoProxy() throws IOException { @@ -48,7 +36,6 @@ public MavenRepoProxy(int port) throws IOException { } private MavenRepoProxy(String proxiedUrl, int port) throws IOException { - httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build(); httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), port), 0); httpServer.createContext("/", exchange -> { try (exchange) { @@ -57,17 +44,12 @@ private MavenRepoProxy(String proxiedUrl, int port) throws IOException { case "GET": if (FORBIDDEN_PATHS.stream().anyMatch( it -> exchange.getRequestURI().getPath().startsWith(it))) { - exchange.sendResponseHeaders(404, 0); + exchange.sendResponseHeaders(404, -1); break; } - var request = mapRequest(proxiedUrl, exchange); - try { - var response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); - mapResponse(response, exchange); - } - catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + var redirectUrl = proxiedUrl + exchange.getRequestURI().getPath(); + exchange.getResponseHeaders().add("Location", redirectUrl); + exchange.sendResponseHeaders(302, -1); break; default: exchange.sendResponseHeaders(405, -1); @@ -85,40 +67,9 @@ URI getBaseUri() { return URI.create("http://" + address.getAddress().getHostName() + ":" + address.getPort()); } - private static void mapResponse(HttpResponse response, HttpExchange exchange) throws IOException { - exchange.sendResponseHeaders(response.statusCode(), - response.headers().firstValueAsLong("Content-Length").orElse(0)); - response.headers().map().forEach((key, values) -> exchange.getResponseHeaders().put(key, values)); - try (InputStream body = response.body()) { - body.transferTo(exchange.getResponseBody()); - } - } - - private static HttpRequest mapRequest(String proxiedUrl, HttpExchange exchange) { - var request = HttpRequest.newBuilder().method(exchange.getRequestMethod(), noBody()) // - .uri(URI.create(proxiedUrl + exchange.getRequestURI().getPath())); - exchange.getRequestHeaders().entrySet().stream() // - .filter(entry -> RESTRICTED_HEADER_NAMES.stream().noneMatch(it -> it.equalsIgnoreCase(entry.getKey()))) // - .forEach(entry -> entry.getValue() // - .forEach(value -> request.header(entry.getKey(), value))); - return request.build(); - } - @Override public void close() { - assertAll( // - () -> assertDoesNotThrow(() -> httpServer.stop(0)), // - () -> assertDoesNotThrow(httpClient::close) // - ); + httpServer.stop(0); } - @SuppressWarnings("unused") - public static void main(String[] args) throws Exception { - try (var proxy = new MavenRepoProxy(12345)) { - System.out.println("Started proxy: " + proxy.getBaseUri()); - while (!Thread.interrupted()) { - Thread.onSpinWait(); - } - } - } } From 8920ee2e2ed2bae2d1d9256a67b1e5ff639977f3 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 18:00:07 +0100 Subject: [PATCH 7/8] Ignore missing checksums for local temp repo --- platform-tooling-support-tests/projects/java-versions/pom.xml | 2 ++ platform-tooling-support-tests/projects/maven-starter/pom.xml | 2 ++ .../projects/maven-surefire-compatibility/pom.xml | 2 ++ .../projects/multi-release-jar/default/pom.xml | 2 ++ platform-tooling-support-tests/projects/vintage/pom.xml | 2 ++ 5 files changed, 10 insertions(+) diff --git a/platform-tooling-support-tests/projects/java-versions/pom.xml b/platform-tooling-support-tests/projects/java-versions/pom.xml index a469343ded01..b71339842409 100644 --- a/platform-tooling-support-tests/projects/java-versions/pom.xml +++ b/platform-tooling-support-tests/projects/java-versions/pom.xml @@ -53,9 +53,11 @@ file://${maven.repo} true + ignore true + ignore diff --git a/platform-tooling-support-tests/projects/maven-starter/pom.xml b/platform-tooling-support-tests/projects/maven-starter/pom.xml index 31aaf42dfffe..68525c5f3c37 100644 --- a/platform-tooling-support-tests/projects/maven-starter/pom.xml +++ b/platform-tooling-support-tests/projects/maven-starter/pom.xml @@ -84,9 +84,11 @@ file://${maven.repo} true + ignore true + ignore diff --git a/platform-tooling-support-tests/projects/maven-surefire-compatibility/pom.xml b/platform-tooling-support-tests/projects/maven-surefire-compatibility/pom.xml index 5ad18aa4522b..087c319f5c44 100644 --- a/platform-tooling-support-tests/projects/maven-surefire-compatibility/pom.xml +++ b/platform-tooling-support-tests/projects/maven-surefire-compatibility/pom.xml @@ -60,9 +60,11 @@ file://${maven.repo} true + ignore true + ignore diff --git a/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml b/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml index 3f99b08745cf..599ad6302bef 100644 --- a/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml +++ b/platform-tooling-support-tests/projects/multi-release-jar/default/pom.xml @@ -63,9 +63,11 @@ file://${maven.repo} true + ignore true + ignore diff --git a/platform-tooling-support-tests/projects/vintage/pom.xml b/platform-tooling-support-tests/projects/vintage/pom.xml index d8f486bf8ba7..e87d42d8d728 100644 --- a/platform-tooling-support-tests/projects/vintage/pom.xml +++ b/platform-tooling-support-tests/projects/vintage/pom.xml @@ -54,9 +54,11 @@ file://${maven.repo} true + ignore true + ignore From 31c917af92b4284d650fe5db510d67eba125da91 Mon Sep 17 00:00:00 2001 From: Marc Philipp Date: Fri, 15 Nov 2024 18:03:28 +0100 Subject: [PATCH 8/8] Throw less generic exception --- .../reporting/open/xml/OpenTestReportGeneratingListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 898a2a203ab5..9381776a0d40 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 @@ -216,7 +216,7 @@ private static Process startProcess(String[] args) { process = Runtime.getRuntime().exec(args); } catch (IOException e) { - throw new RuntimeException(e); + throw new UncheckedIOException("Failed to start process", e); } return process; }