Skip to content

Commit 7c85124

Browse files
raccoonbackmpkorstanjemarcphilipp
authored
Allow @ResourceLock on @ClassTemplate classes (#5176)
Fixes #5155. --------- Signed-off-by: raccoonback <kosb15@naver.com> Co-authored-by: M.P. Korstanje <mpkorstanje@users.noreply.github.com> Co-authored-by: Marc Philipp <mail@marcphilipp.de>
1 parent bea12a8 commit 7c85124

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

documentation/src/docs/asciidoc/release-notes/release-notes-6.0.2.adoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ repository on GitHub.
3535
[[release-notes-6.0.2-junit-jupiter-bug-fixes]]
3636
==== Bug Fixes
3737

38-
* ❓
38+
* Allow using `@ResourceLock` on classes annotated with `@ClassTemplate` (or
39+
`@ParameterizedClass`).
3940

4041
[[release-notes-6.0.2-junit-jupiter-deprecations-and-breaking-changes]]
4142
==== Deprecations and Breaking Changes

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTemplateInvocationTestDescriptor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package org.junit.jupiter.engine.descriptor;
1212

13+
import static java.util.Collections.emptySet;
1314
import static java.util.Objects.requireNonNull;
1415
import static org.apiguardian.api.API.Status.INTERNAL;
1516
import static org.junit.jupiter.engine.descriptor.CallbackSupport.invokeAfterCallbacks;
@@ -36,6 +37,7 @@
3637
import org.junit.jupiter.engine.extension.MutableExtensionRegistry;
3738
import org.junit.platform.engine.TestSource;
3839
import org.junit.platform.engine.UniqueId;
40+
import org.junit.platform.engine.support.hierarchical.ExclusiveResource;
3941
import org.junit.platform.engine.support.hierarchical.ThrowableCollector;
4042

4143
/**
@@ -112,6 +114,12 @@ public Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> getResou
112114

113115
// --- Node ----------------------------------------------------------------
114116

117+
@Override
118+
public Set<ExclusiveResource> getExclusiveResources() {
119+
// Resources are already collected and returned by the enclosing ClassTemplateTestDescriptor
120+
return emptySet();
121+
}
122+
115123
@Override
116124
public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext context) {
117125
MutableExtensionRegistry registry = context.getExtensionRegistry();

jupiter-tests/src/test/java/org/junit/jupiter/engine/ClassTemplateInvocationTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.junit.jupiter.api.extension.ParameterResolutionException;
8080
import org.junit.jupiter.api.extension.ParameterResolver;
8181
import org.junit.jupiter.api.extension.RegisterExtension;
82+
import org.junit.jupiter.api.parallel.ResourceLock;
8283
import org.junit.jupiter.engine.descriptor.ClassTemplateInvocationTestDescriptor;
8384
import org.junit.jupiter.engine.descriptor.ClassTemplateTestDescriptor;
8485
import org.junit.jupiter.engine.descriptor.ClassTestDescriptor;
@@ -95,6 +96,7 @@
9596
import org.junit.platform.engine.UniqueId;
9697
import org.junit.platform.engine.discovery.DiscoverySelectors;
9798
import org.junit.platform.engine.reporting.ReportEntry;
99+
import org.junit.platform.engine.support.hierarchical.ExclusiveResource;
98100
import org.junit.platform.testkit.engine.EngineExecutionResults;
99101
import org.opentest4j.AssertionFailedError;
100102
import org.opentest4j.TestAbortedException;
@@ -1004,6 +1006,24 @@ void ignoresComposedAnnotations() {
10041006
assertThat(engineDescriptor.getDescendants()).isEmpty();
10051007
}
10061008

1009+
@Test
1010+
void classTemplateWithResourceLockCollectsExclusiveResources() {
1011+
var results = discoverTestsForClass(ClassTemplateWithResourceLockTestCase.class);
1012+
var classTemplateDescriptor = (ClassTemplateTestDescriptor) getOnlyElement(
1013+
results.getEngineDescriptor().getChildren());
1014+
1015+
assertThat(classTemplateDescriptor.getExclusiveResources()).extracting(
1016+
ExclusiveResource::getKey).containsExactly("test-resource");
1017+
}
1018+
1019+
@Test
1020+
void classTemplateWithResourceLockExecutesSuccessfully() {
1021+
var results = executeTestsForClass(ClassTemplateWithResourceLockTestCase.class);
1022+
1023+
results.testEvents().assertStatistics(stats -> stats.started(2).succeeded(2));
1024+
results.containerEvents().assertStatistics(stats -> stats.started(4).succeeded(4));
1025+
}
1026+
10071027
// -------------------------------------------------------------------
10081028

10091029
private static Stream<String> allReportEntryValues(EngineExecutionResults results) {
@@ -1567,4 +1587,15 @@ void test() {
15671587
}
15681588
}
15691589

1590+
@SuppressWarnings("JUnitMalformedDeclaration")
1591+
@ClassTemplate
1592+
@ExtendWith(TwoInvocationsClassTemplateInvocationContextProvider.class)
1593+
@ResourceLock("test-resource")
1594+
static class ClassTemplateWithResourceLockTestCase {
1595+
@Test
1596+
void test() {
1597+
// This test verifies that @ResourceLock works with @ClassTemplate (issue #5155)
1598+
}
1599+
}
1600+
15701601
}

0 commit comments

Comments
 (0)