Skip to content

Commit 9f6ad01

Browse files
committed
Generalize resource management
1 parent e087b47 commit 9f6ad01

File tree

7 files changed

+127
-98
lines changed

7 files changed

+127
-98
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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.lang.annotation.ElementType;
17+
import java.lang.annotation.Retention;
18+
import java.lang.annotation.Target;
19+
20+
import org.junit.jupiter.api.extension.ExtendWith;
21+
import org.junit.jupiter.api.extension.ExtensionContext;
22+
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
23+
import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource;
24+
import org.junit.jupiter.api.extension.ParameterContext;
25+
import org.junit.jupiter.api.extension.ParameterResolutionException;
26+
import org.junit.jupiter.api.extension.ParameterResolver;
27+
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
28+
import org.junit.platform.commons.support.AnnotationSupport;
29+
import org.junit.platform.commons.support.HierarchyTraversalMode;
30+
import org.junit.platform.commons.support.ReflectionSupport;
31+
import org.junit.platform.commons.util.Preconditions;
32+
33+
@Target({ ElementType.PARAMETER, ElementType.FIELD })
34+
@Retention(RUNTIME)
35+
@ExtendWith(GlobalResource.Extension.class)
36+
public @interface GlobalResource {
37+
38+
class Extension implements ParameterResolver, TestInstancePostProcessor {
39+
40+
@Override
41+
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
42+
throws ParameterResolutionException {
43+
return parameterContext.isAnnotated(GlobalResource.class);
44+
}
45+
46+
@Override
47+
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
48+
throws ParameterResolutionException {
49+
Class<?> type = parameterContext.getParameter().getType();
50+
return getOrCreateResource(extensionContext, type).get();
51+
}
52+
53+
@Override
54+
public void postProcessTestInstance(Object testInstance, ExtensionContext extensionContext) {
55+
streamFields(testInstance.getClass(), field -> AnnotationSupport.isAnnotated(field, GlobalResource.class),
56+
HierarchyTraversalMode.BOTTOM_UP) //
57+
.forEach(field -> {
58+
try {
59+
field.set(testInstance, getOrCreateResource(extensionContext, field.getType()).get());
60+
}
61+
catch (IllegalAccessException e) {
62+
throw new RuntimeException("Failed to inject resource into field: " + field, e);
63+
}
64+
});
65+
}
66+
67+
@SuppressWarnings("unchecked")
68+
private <T> Resource<T> getOrCreateResource(ExtensionContext extensionContext, Class<T> type) {
69+
return extensionContext.getRoot().getStore(Namespace.GLOBAL) //
70+
.getOrComputeIfAbsent(type, Resource::new, Resource.class);
71+
}
72+
}
73+
74+
class Resource<T> implements CloseableResource {
75+
76+
private final T value;
77+
78+
private Resource(Class<T> type) {
79+
Preconditions.condition(AutoCloseable.class.isAssignableFrom(type),
80+
() -> "Resource type must implement AutoCloseable: " + type.getName());
81+
this.value = ReflectionSupport.newInstance(type);
82+
}
83+
84+
private T get() {
85+
return value;
86+
}
87+
88+
@Override
89+
public void close() throws Throwable {
90+
((AutoCloseable) value).close();
91+
}
92+
}
93+
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@
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;
3130

3231
/**
3332
* @since 1.4
3433
*/
3534
class JavaVersionsTests {
3635

37-
@LocalMavenRepo
38-
Directory localMavenRepo;
36+
@GlobalResource
37+
LocalMavenRepo localMavenRepo;
3938

4039
@Test
4140
void java_8() {

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

Lines changed: 22 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -10,103 +10,41 @@
1010

1111
package platform.tooling.support.tests;
1212

13-
import static java.lang.annotation.RetentionPolicy.RUNTIME;
14-
import static org.junit.platform.commons.support.ReflectionSupport.streamFields;
15-
1613
import java.io.IOException;
1714
import java.io.UncheckedIOException;
18-
import java.lang.annotation.ElementType;
19-
import java.lang.annotation.Retention;
20-
import java.lang.annotation.Target;
2115
import java.nio.file.Files;
2216
import java.nio.file.Path;
2317
import java.util.Comparator;
2418

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 {
19+
public class LocalMavenRepo implements AutoCloseable {
4120

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-
}
21+
private final Path tempDir;
4922

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);
23+
public LocalMavenRepo() {
24+
try {
25+
tempDir = Files.createTempDirectory("local-maven-repo-");
5626
}
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);
27+
catch (IOException e) {
28+
throw new RuntimeException(e);
7729
}
7830
}
7931

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-
}
32+
public String toCliArgument() {
33+
return "-Dmaven.repo.local=" + tempDir;
34+
}
9635

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-
}
36+
@Override
37+
public void close() throws IOException {
38+
try (var files = Files.walk(tempDir)) {
39+
files.sorted(Comparator.<Path> naturalOrder().reversed()) //
40+
.forEach(path -> {
41+
try {
42+
Files.delete(path);
43+
}
44+
catch (IOException e) {
45+
throw new UncheckedIOException(e);
46+
}
47+
});
11048
}
11149
}
11250
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,18 @@
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;
2827

2928
/**
3029
* @since 1.3
3130
*/
3231
class MavenStarterTests {
3332

33+
@GlobalResource
34+
LocalMavenRepo localMavenRepo;
35+
3436
@ResourceLock(Projects.MAVEN_STARTER)
3537
@Test
36-
void verifyMavenStarterProject(@LocalMavenRepo Directory localMavenRepo) {
38+
void verifyMavenStarterProject() {
3739
var request = Request.builder() //
3840
.setTool(Request.maven()) //
3941
.setProject(Projects.MAVEN_STARTER) //

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@
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;
3130

3231
/**
3332
* @since 1.9.2
3433
*/
3534
class MavenSurefireCompatibilityTests {
3635

37-
@LocalMavenRepo
38-
Directory localMavenRepo;
36+
@GlobalResource
37+
LocalMavenRepo localMavenRepo;
3938

4039
@ResourceLock(Projects.MAVEN_SUREFIRE_COMPATIBILITY)
4140
@ParameterizedTest

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@
2828

2929
import platform.tooling.support.MavenRepo;
3030
import platform.tooling.support.Request;
31-
import platform.tooling.support.tests.LocalMavenRepo.Directory;
3231

3332
/**
3433
* @since 1.4
3534
*/
3635
class MultiReleaseJarTests {
3736

38-
@LocalMavenRepo
39-
Directory localMavenRepo;
37+
@GlobalResource
38+
LocalMavenRepo localMavenRepo;
4039

4140
@ResourceLock(Projects.MULTI_RELEASE_JAR)
4241
@Test

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@
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;
2827

2928
class VintageMavenIntegrationTests {
3029

31-
@LocalMavenRepo
32-
Directory localMavenRepo;
30+
@GlobalResource
31+
LocalMavenRepo localMavenRepo;
3332

3433
@Test
3534
void unsupportedVersion() {

0 commit comments

Comments
 (0)