Skip to content

Commit 2815054

Browse files
committed
Add executionCondition() to Configuration interface
Issue: #4620
1 parent 32145c0 commit 2815054

File tree

5 files changed

+57
-2
lines changed

5 files changed

+57
-2
lines changed

junit-jupiter-api/src/main/java/org/junit/jupiter/api/DynamicContainer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
import java.util.List;
1717
import java.util.Optional;
1818
import java.util.function.Consumer;
19+
import java.util.function.Function;
1920
import java.util.stream.Stream;
2021
import java.util.stream.StreamSupport;
2122

2223
import org.apiguardian.api.API;
2324
import org.jspecify.annotations.Nullable;
25+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
26+
import org.junit.jupiter.api.extension.ExtensionContext;
2427
import org.junit.jupiter.api.parallel.ExecutionMode;
2528
import org.junit.platform.commons.util.Preconditions;
2629

@@ -131,6 +134,10 @@ public interface Configuration extends DynamicNode.Configuration {
131134
@Override
132135
Configuration source(@Nullable URI testSourceUri);
133136

137+
@Override
138+
Configuration executionCondition(
139+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition);
140+
134141
@Override
135142
Configuration executionMode(ExecutionMode executionMode);
136143

@@ -173,6 +180,13 @@ public Configuration source(@Nullable URI testSourceUri) {
173180
return this;
174181
}
175182

183+
@Override
184+
public Configuration executionCondition(
185+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition) {
186+
super.executionCondition(condition);
187+
return this;
188+
}
189+
176190
@Override
177191
public Configuration executionMode(ExecutionMode executionMode) {
178192
super.executionMode(executionMode);

junit-jupiter-api/src/main/java/org/junit/jupiter/api/DynamicNode.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414

1515
import java.net.URI;
1616
import java.util.Optional;
17+
import java.util.function.Function;
1718

1819
import org.apiguardian.api.API;
1920
import org.jspecify.annotations.Nullable;
21+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
22+
import org.junit.jupiter.api.extension.ExtensionContext;
2023
import org.junit.jupiter.api.parallel.ExecutionMode;
2124
import org.junit.platform.commons.util.Preconditions;
2225
import org.junit.platform.commons.util.ToStringBuilder;
@@ -38,11 +41,13 @@ public abstract class DynamicNode {
3841
private final @Nullable URI testSourceUri;
3942

4043
private final @Nullable ExecutionMode executionMode;
44+
private final @Nullable Function<? super ExtensionContext, ? extends ConditionEvaluationResult> executionCondition;
4145

4246
DynamicNode(AbstractConfiguration configuration) {
4347
this.displayName = Preconditions.notBlank(configuration.displayName, "displayName must not be null or blank");
4448
this.testSourceUri = configuration.testSourceUri;
4549
this.executionMode = configuration.executionMode;
50+
this.executionCondition = configuration.executionCondition;
4651
}
4752

4853
/**
@@ -69,6 +74,10 @@ public Optional<ExecutionMode> getExecutionMode() {
6974
return Optional.ofNullable(executionMode);
7075
}
7176

77+
public Optional<Function<? super ExtensionContext, ? extends ConditionEvaluationResult>> getExecutionCondition() {
78+
return Optional.ofNullable(executionCondition);
79+
}
80+
7281
@Override
7382
public String toString() {
7483
return new ToStringBuilder(this) //
@@ -83,6 +92,9 @@ public interface Configuration {
8392

8493
Configuration source(@Nullable URI testSourceUri);
8594

95+
Configuration executionCondition(
96+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition);
97+
8698
Configuration executionMode(ExecutionMode executionMode);
8799

88100
Configuration executionMode(ExecutionMode executionMode, String reason);
@@ -94,6 +106,7 @@ abstract static class AbstractConfiguration implements Configuration {
94106
private @Nullable String displayName;
95107
private @Nullable URI testSourceUri;
96108
private @Nullable ExecutionMode executionMode;
109+
private @Nullable Function<? super ExtensionContext, ? extends ConditionEvaluationResult> executionCondition;
97110

98111
@Override
99112
public Configuration displayName(String displayName) {
@@ -107,6 +120,14 @@ public Configuration source(@Nullable URI testSourceUri) {
107120
return this;
108121
}
109122

123+
@Override
124+
public Configuration executionCondition(
125+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition) {
126+
// TODO Handle multiple calls
127+
this.executionCondition = condition;
128+
return this;
129+
}
130+
110131
@Override
111132
public Configuration executionMode(ExecutionMode executionMode) {
112133
this.executionMode = executionMode;

junit-jupiter-api/src/main/java/org/junit/jupiter/api/DynamicTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import org.apiguardian.api.API;
2525
import org.jspecify.annotations.Nullable;
26+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
27+
import org.junit.jupiter.api.extension.ExtensionContext;
2628
import org.junit.jupiter.api.function.Executable;
2729
import org.junit.jupiter.api.function.ThrowingConsumer;
2830
import org.junit.jupiter.api.parallel.ExecutionMode;
@@ -318,6 +320,10 @@ public interface Configuration extends DynamicNode.Configuration {
318320
@Override
319321
Configuration source(@Nullable URI testSourceUri);
320322

323+
@Override
324+
Configuration executionCondition(
325+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition);
326+
321327
@Override
322328
Configuration executionMode(ExecutionMode executionMode);
323329

@@ -343,6 +349,13 @@ public Configuration source(@Nullable URI testSourceUri) {
343349
return this;
344350
}
345351

352+
@Override
353+
public Configuration executionCondition(
354+
Function<? super ExtensionContext, ? extends ConditionEvaluationResult> condition) {
355+
super.executionCondition(condition);
356+
return this;
357+
}
358+
346359
@Override
347360
public Configuration executionMode(ExecutionMode executionMode) {
348361
super.executionMode(executionMode);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
package org.junit.jupiter.engine.descriptor;
1212

1313
import java.util.Optional;
14+
import java.util.function.Function;
1415

1516
import org.jspecify.annotations.Nullable;
1617
import org.junit.jupiter.api.DynamicNode;
18+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
1719
import org.junit.jupiter.api.extension.ExtensionContext;
1820
import org.junit.jupiter.engine.config.JupiterConfiguration;
1921
import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext;
@@ -30,12 +32,14 @@ abstract class DynamicNodeTestDescriptor extends JupiterTestDescriptor {
3032

3133
protected final int index;
3234
private final Optional<ExecutionMode> executionMode;
35+
private final Optional<Function<? super ExtensionContext, ? extends ConditionEvaluationResult>> executionCondition;
3336

3437
DynamicNodeTestDescriptor(UniqueId uniqueId, int index, DynamicNode dynamicNode, @Nullable TestSource testSource,
3538
JupiterConfiguration configuration) {
3639
super(uniqueId, dynamicNode.getDisplayName(), testSource, configuration);
3740
this.index = index;
3841
this.executionMode = dynamicNode.getExecutionMode().map(JupiterTestDescriptor::toExecutionMode);
42+
this.executionCondition = dynamicNode.getExecutionCondition();
3943
}
4044

4145
@Override
@@ -67,7 +71,10 @@ public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext conte
6771

6872
@Override
6973
public SkipResult shouldBeSkipped(JupiterEngineExecutionContext context) {
70-
return SkipResult.doNotSkip();
74+
return this.executionCondition //
75+
.map(condition -> condition.apply(context.getExtensionContext())) //
76+
.map(this::toSkipResult) //
77+
.orElse(SkipResult.doNotSkip());
7178
}
7279

7380
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public SkipResult shouldBeSkipped(JupiterEngineExecutionContext context) {
191191
return toSkipResult(evaluationResult);
192192
}
193193

194-
private SkipResult toSkipResult(ConditionEvaluationResult evaluationResult) {
194+
protected SkipResult toSkipResult(ConditionEvaluationResult evaluationResult) {
195195
if (evaluationResult.isDisabled()) {
196196
return SkipResult.skip(evaluationResult.getReason().orElse("<unknown>"));
197197
}

0 commit comments

Comments
 (0)