Skip to content

Commit fb44682

Browse files
authored
Improve detection of parallel mode in thread leak detection extension. (#16)
1 parent 737a25b commit fb44682

1 file changed

Lines changed: 37 additions & 3 deletions

File tree

randomizedtesting-jupiter/src/main/java/com/carrotsearch/randomizedtesting/jupiter/internals/DetectThreadLeaksExtension.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.HashSet;
77
import java.util.LinkedHashSet;
88
import java.util.List;
9+
import java.util.Locale;
910
import java.util.Map;
1011
import java.util.concurrent.TimeUnit;
1112
import java.util.function.Predicate;
@@ -26,8 +27,8 @@ public class DetectThreadLeaksExtension
2627
private static final ExtensionContext.Namespace EXTENSION_NAMESPACE =
2728
ExtensionContext.Namespace.create(DetectThreadLeaksExtension.class);
2829
private static final String THREAD_SNAPSHOT_KEY = "snapshot";
29-
private static final String CONCURRENT_KEY = "concurrent";
3030
private static final String UNCAUGHT_EXCEPTION_HANDLER_KEY = "uncaught-exception-handler";
31+
private static final String CONCURRENT_MODE_ON = "concurrent-mode";
3132

3233
/** Total time budget to join interrupted threads before giving up. */
3334
private static final Duration INTERRUPT_JOIN_MS = Duration.ofSeconds(3);
@@ -38,12 +39,45 @@ public void beforeAll(ExtensionContext context) {
3839
return;
3940
}
4041

42+
var rootContext = context.getRoot();
43+
var parallelMode =
44+
rootContext
45+
.getStore(EXTENSION_NAMESPACE)
46+
.computeIfAbsent(
47+
CONCURRENT_MODE_ON,
48+
(k) -> {
49+
var parallelEnabled =
50+
rootContext
51+
.getConfigurationParameter("junit.jupiter.execution.parallel.enabled")
52+
.map(Boolean::parseBoolean)
53+
.orElse(false);
54+
55+
var parallelClasses =
56+
rootContext
57+
.getConfigurationParameter(
58+
"junit.jupiter.execution.parallel.mode.classes.default")
59+
.map(v -> ExecutionMode.valueOf(v.toUpperCase(Locale.ROOT)))
60+
.orElse(ExecutionMode.SAME_THREAD);
61+
62+
boolean isParallelMode =
63+
parallelEnabled && parallelClasses != ExecutionMode.SAME_THREAD;
64+
if (isParallelMode) {
65+
LOGGER.warning("Thread leak detection is disabled in parallel mode.");
66+
}
67+
return isParallelMode;
68+
},
69+
Boolean.class);
70+
71+
if (parallelMode) {
72+
return;
73+
}
74+
4175
if (context.getExecutionMode() != ExecutionMode.SAME_THREAD) {
4276
LOGGER.warning(
4377
"Thread leak detection is disabled: tests in ["
4478
+ context.getDisplayName()
4579
+ "] run in concurrent execution mode.");
46-
context.getStore(EXTENSION_NAMESPACE).put(CONCURRENT_KEY, Boolean.TRUE);
80+
context.getStore(EXTENSION_NAMESPACE).put(CONCURRENT_MODE_ON, Boolean.TRUE);
4781
return;
4882
}
4983

@@ -173,7 +207,7 @@ private static boolean isConcurrentMode(ExtensionContext context) {
173207
.map(
174208
p ->
175209
Boolean.TRUE.equals(
176-
p.getStore(EXTENSION_NAMESPACE).get(CONCURRENT_KEY, Boolean.class)))
210+
p.getStore(EXTENSION_NAMESPACE).get(CONCURRENT_MODE_ON, Boolean.class)))
177211
.orElse(false);
178212
}
179213

0 commit comments

Comments
 (0)