Skip to content

Commit e087b47

Browse files
committed
Start Maven builds with empty local repo to avoid flakiness
1 parent 8f79a2a commit e087b47

File tree

6 files changed

+135
-6
lines changed

6 files changed

+135
-6
lines changed

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/JavaVersionsTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@
2727
import platform.tooling.support.Helper;
2828
import platform.tooling.support.MavenRepo;
2929
import platform.tooling.support.Request;
30+
import platform.tooling.support.tests.LocalMavenRepo.Directory;
3031

3132
/**
3233
* @since 1.4
3334
*/
3435
class JavaVersionsTests {
3536

37+
@LocalMavenRepo
38+
Directory localMavenRepo;
39+
3640
@Test
3741
void java_8() {
3842
var java8Home = Helper.getJavaHome("8");
@@ -54,7 +58,7 @@ List<String> execute(String version, Path javaHome, Map<String, String> environm
5458
.setTool(Request.maven()) //
5559
.setProject(Projects.JAVA_VERSIONS) //
5660
.setWorkspace("java-versions-" + version) //
57-
.addArguments("-Dmaven.repo=" + MavenRepo.dir()) //
61+
.addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) //
5862
.addArguments("--update-snapshots", "--batch-mode", "verify") //
5963
.setTimeout(TOOL_TIMEOUT) //
6064
.setJavaHome(javaHome);
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* Copyright 2015-2024 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package platform.tooling.support.tests;
12+
13+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
14+
import static org.junit.platform.commons.support.ReflectionSupport.streamFields;
15+
16+
import java.io.IOException;
17+
import java.io.UncheckedIOException;
18+
import java.lang.annotation.ElementType;
19+
import java.lang.annotation.Retention;
20+
import java.lang.annotation.Target;
21+
import java.nio.file.Files;
22+
import java.nio.file.Path;
23+
import java.util.Comparator;
24+
25+
import org.junit.jupiter.api.extension.ExtendWith;
26+
import org.junit.jupiter.api.extension.ExtensionContext;
27+
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
28+
import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource;
29+
import org.junit.jupiter.api.extension.ParameterContext;
30+
import org.junit.jupiter.api.extension.ParameterResolutionException;
31+
import org.junit.jupiter.api.extension.ParameterResolver;
32+
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
33+
import org.junit.platform.commons.support.AnnotationSupport;
34+
import org.junit.platform.commons.support.HierarchyTraversalMode;
35+
import org.junit.platform.commons.util.Preconditions;
36+
37+
@Target({ ElementType.PARAMETER, ElementType.FIELD })
38+
@Retention(RUNTIME)
39+
@ExtendWith(LocalMavenRepo.Extension.class)
40+
public @interface LocalMavenRepo {
41+
42+
class Extension implements ParameterResolver, TestInstancePostProcessor {
43+
44+
@Override
45+
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
46+
throws ParameterResolutionException {
47+
return parameterContext.isAnnotated(LocalMavenRepo.class);
48+
}
49+
50+
@Override
51+
public Directory resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
52+
throws ParameterResolutionException {
53+
Preconditions.condition(Directory.class.equals(parameterContext.getParameter().getType()),
54+
() -> "Parameter must be of type " + Directory.class + ": " + parameterContext.getParameter());
55+
return getOrCreateDirectory(extensionContext);
56+
}
57+
58+
@Override
59+
public void postProcessTestInstance(Object testInstance, ExtensionContext context) {
60+
streamFields(testInstance.getClass(), field -> AnnotationSupport.isAnnotated(field, LocalMavenRepo.class),
61+
HierarchyTraversalMode.BOTTOM_UP) //
62+
.forEach(field -> {
63+
Preconditions.condition(Directory.class.equals(field.getType()),
64+
() -> "Field must be of type " + Directory.class + ": " + field);
65+
try {
66+
field.set(testInstance, getOrCreateDirectory(context));
67+
}
68+
catch (IllegalAccessException e) {
69+
throw new RuntimeException(e);
70+
}
71+
});
72+
}
73+
74+
private Directory getOrCreateDirectory(ExtensionContext extensionContext) {
75+
return extensionContext.getRoot().getStore(Namespace.GLOBAL) //
76+
.getOrComputeIfAbsent(Directory.class, __ -> new Directory(), Directory.class);
77+
}
78+
}
79+
80+
class Directory implements CloseableResource {
81+
82+
private final Path tempDir;
83+
84+
private Directory() {
85+
try {
86+
tempDir = Files.createTempDirectory("local-maven-repo-");
87+
}
88+
catch (IOException e) {
89+
throw new RuntimeException(e);
90+
}
91+
}
92+
93+
public String toCliArgument() {
94+
return "-Dmaven.repo.local=" + tempDir;
95+
}
96+
97+
@Override
98+
public void close() throws Throwable {
99+
try (var files = Files.walk(tempDir)) {
100+
files.sorted(Comparator.<Path> naturalOrder().reversed()) //
101+
.forEach(path -> {
102+
try {
103+
Files.delete(path);
104+
}
105+
catch (IOException e) {
106+
throw new UncheckedIOException(e);
107+
}
108+
});
109+
}
110+
}
111+
}
112+
}

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenStarterTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import platform.tooling.support.Helper;
2525
import platform.tooling.support.MavenRepo;
2626
import platform.tooling.support.Request;
27+
import platform.tooling.support.tests.LocalMavenRepo.Directory;
2728

2829
/**
2930
* @since 1.3
@@ -32,11 +33,11 @@ class MavenStarterTests {
3233

3334
@ResourceLock(Projects.MAVEN_STARTER)
3435
@Test
35-
void verifyMavenStarterProject() {
36+
void verifyMavenStarterProject(@LocalMavenRepo Directory localMavenRepo) {
3637
var request = Request.builder() //
3738
.setTool(Request.maven()) //
3839
.setProject(Projects.MAVEN_STARTER) //
39-
.addArguments("-Dmaven.repo=" + MavenRepo.dir()) //
40+
.addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) //
4041
.addArguments("--update-snapshots", "--batch-mode", "verify") //
4142
.setTimeout(TOOL_TIMEOUT) //
4243
.setJavaHome(Helper.getJavaHome("8").orElseThrow(TestAbortedException::new)) //

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MavenSurefireCompatibilityTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@
2727
import platform.tooling.support.Helper;
2828
import platform.tooling.support.MavenRepo;
2929
import platform.tooling.support.Request;
30+
import platform.tooling.support.tests.LocalMavenRepo.Directory;
3031

3132
/**
3233
* @since 1.9.2
3334
*/
3435
class MavenSurefireCompatibilityTests {
3536

37+
@LocalMavenRepo
38+
Directory localMavenRepo;
39+
3640
@ResourceLock(Projects.MAVEN_SUREFIRE_COMPATIBILITY)
3741
@ParameterizedTest
3842
@CsvSource(delimiter = '|', nullValues = "<none>", textBlock = """
@@ -44,7 +48,7 @@ void testMavenSurefireCompatibilityProject(String surefireVersion, String extraA
4448
var request = Request.builder() //
4549
.setTool(Request.maven()) //
4650
.setProject(Projects.MAVEN_SUREFIRE_COMPATIBILITY) //
47-
.addArguments("-Dmaven.repo=" + MavenRepo.dir()) //
51+
.addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) //
4852
.addArguments("-Dsurefire.version=" + surefireVersion) //
4953
.addArguments("--update-snapshots", "--batch-mode", "test") //
5054
.addArguments(extraArgs) //

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/MultiReleaseJarTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@
2828

2929
import platform.tooling.support.MavenRepo;
3030
import platform.tooling.support.Request;
31+
import platform.tooling.support.tests.LocalMavenRepo.Directory;
3132

3233
/**
3334
* @since 1.4
3435
*/
3536
class MultiReleaseJarTests {
3637

38+
@LocalMavenRepo
39+
Directory localMavenRepo;
40+
3741
@ResourceLock(Projects.MULTI_RELEASE_JAR)
3842
@Test
3943
void checkDefault() throws Exception {
@@ -88,7 +92,7 @@ private Result mvn(String variant) {
8892
var builder = Request.builder() //
8993
.setTool(Request.maven()) //
9094
.setProject(Projects.MULTI_RELEASE_JAR) //
91-
.addArguments("-Dmaven.repo=" + MavenRepo.dir()) //
95+
.addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) //
9296
.addArguments("--update-snapshots", "--show-version", "--errors", "--batch-mode", "--file", variant,
9397
"test") //
9498
.setTimeout(TOOL_TIMEOUT);

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/VintageMavenIntegrationTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424
import platform.tooling.support.Helper;
2525
import platform.tooling.support.MavenRepo;
2626
import platform.tooling.support.Request;
27+
import platform.tooling.support.tests.LocalMavenRepo.Directory;
2728

2829
class VintageMavenIntegrationTests {
2930

31+
@LocalMavenRepo
32+
Directory localMavenRepo;
33+
3034
@Test
3135
void unsupportedVersion() {
3236
var result = run("4.11");
@@ -61,7 +65,7 @@ private Result run(String version) {
6165
.setProject(Projects.VINTAGE) //
6266
.setWorkspace("vintage-maven-" + version) //
6367
.addArguments("clean", "test", "--update-snapshots", "--batch-mode") //
64-
.addArguments("-Dmaven.repo=" + MavenRepo.dir()) //
68+
.addArguments(localMavenRepo.toCliArgument(), "-Dmaven.repo=" + MavenRepo.dir()) //
6569
.addArguments("-Djunit4Version=" + version) //
6670
.setTimeout(TOOL_TIMEOUT) //
6771
.build() //

0 commit comments

Comments
 (0)