Skip to content

Commit 7c8f22d

Browse files
committed
Add executionCondition() to Configuration interface
Issue: #4620
1 parent 7ccf39e commit 7c8f22d

File tree

6 files changed

+61
-5
lines changed

6 files changed

+61
-5
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 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
@@ -24,6 +24,8 @@
2424

2525
import org.apiguardian.api.API;
2626
import org.jspecify.annotations.Nullable;
27+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
28+
import org.junit.jupiter.api.extension.ExtensionContext;
2729
import org.junit.jupiter.api.function.Executable;
2830
import org.junit.jupiter.api.function.ThrowingConsumer;
2931
import org.junit.jupiter.api.parallel.ExecutionMode;
@@ -319,6 +321,10 @@ public interface Configuration extends DynamicNode.Configuration {
319321
@Override
320322
Configuration source(@Nullable URI testSourceUri);
321323

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

@@ -344,6 +350,13 @@ public Configuration source(@Nullable URI testSourceUri) {
344350
return this;
345351
}
346352

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

junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ConditionEvaluationResult.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Optional;
1616

1717
import org.apiguardian.api.API;
18+
import org.jspecify.annotations.Nullable;
1819
import org.junit.platform.commons.util.StringUtils;
1920
import org.junit.platform.commons.util.ToStringBuilder;
2021

@@ -32,7 +33,7 @@ public class ConditionEvaluationResult {
3233
* @param reason the reason why the container or test should be enabled
3334
* @return an enabled {@code ConditionEvaluationResult} with the given reason
3435
*/
35-
public static ConditionEvaluationResult enabled(String reason) {
36+
public static ConditionEvaluationResult enabled(@Nullable String reason) {
3637
return new ConditionEvaluationResult(true, reason);
3738
}
3839

@@ -42,7 +43,7 @@ public static ConditionEvaluationResult enabled(String reason) {
4243
* @param reason the reason why the container or test should be disabled
4344
* @return a disabled {@code ConditionEvaluationResult} with the given reason
4445
*/
45-
public static ConditionEvaluationResult disabled(String reason) {
46+
public static ConditionEvaluationResult disabled(@Nullable String reason) {
4647
return new ConditionEvaluationResult(false, reason);
4748
}
4849

@@ -67,7 +68,7 @@ public static ConditionEvaluationResult disabled(String reason, String customRea
6768

6869
private final Optional<String> reason;
6970

70-
private ConditionEvaluationResult(boolean enabled, String reason) {
71+
private ConditionEvaluationResult(boolean enabled, @Nullable String reason) {
7172
this.enabled = enabled;
7273
this.reason = Optional.ofNullable(reason);
7374
}

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)