Skip to content

Commit aa0e34d

Browse files
committed
Make phase that fails due to critical discovery issues configurable
Users of the Launcher API that perform a discovery without executing the resulting test plan are prone to accidentally hiding discovery issues from their users unless they implement their own `LauncherDiscoveryListener`. Therefore, the new `junit.platform.discovery.issue.failure.phase` configuration parameter allows configuring the `discovery` phase as the one that should fail in case critical discovery issues are encountered. By default, they will still be reported in the `execution` phase.
1 parent bf12674 commit aa0e34d

File tree

13 files changed

+144
-29
lines changed

13 files changed

+144
-29
lines changed

junit-platform-launcher/src/main/java/org/junit/platform/launcher/LauncherConstants.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,10 @@ public class LauncherConstants {
225225
*
226226
* <p>If an engine reports an issue with a severity equal to or higher than
227227
* the configured critical severity, its tests will not be executed.
228-
* Instead, the engine will be reported as failed during execution with a
228+
* Depending on {@link #DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME}, a
229229
* {@link org.junit.platform.launcher.core.DiscoveryIssueException} listing
230-
* all critical issues.
230+
* all critical issues will be thrown during discovery or be reported as
231+
* engine-level failure during execution.
231232
*
232233
* <h4>Supported Values</h4>
233234
*
@@ -244,6 +245,22 @@ public class LauncherConstants {
244245
@API(status = EXPERIMENTAL, since = "1.13")
245246
public static final String CRITICAL_DISCOVERY_ISSUE_SEVERITY_PROPERTY_NAME = "junit.platform.discovery.issue.severity.critical";
246247

248+
/**
249+
* Property name used to configure the phase that critical discovery issues
250+
* should cause a failure
251+
*
252+
* <h4>Supported Values</h4>
253+
*
254+
* <p>Supported values are "discovery" or "execution".
255+
*
256+
* <p>If not specified, the default is "execution".
257+
*
258+
* @since 1.13
259+
* @see #CRITICAL_DISCOVERY_ISSUE_SEVERITY_PROPERTY_NAME
260+
*/
261+
@API(status = EXPERIMENTAL, since = "1.13")
262+
public static final String DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME = "junit.platform.discovery.issue.failure.phase";
263+
247264
private LauncherConstants() {
248265
/* no-op */
249266
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DiscoveryIssueNotifier.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@
1414
import static java.util.Comparator.comparing;
1515
import static java.util.stream.Collectors.partitioningBy;
1616
import static org.junit.platform.commons.util.ExceptionUtils.readStackTrace;
17+
import static org.junit.platform.launcher.LauncherConstants.DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME;
1718

1819
import java.util.ArrayList;
1920
import java.util.List;
2021
import java.util.Map;
22+
import java.util.Optional;
2123
import java.util.function.Consumer;
2224
import java.util.function.Supplier;
2325

2426
import org.junit.platform.commons.logging.Logger;
2527
import org.junit.platform.commons.logging.LoggerFactory;
2628
import org.junit.platform.commons.util.Preconditions;
29+
import org.junit.platform.engine.ConfigurationParameters;
2730
import org.junit.platform.engine.DiscoveryIssue;
2831
import org.junit.platform.engine.DiscoveryIssue.Severity;
2932
import org.junit.platform.engine.TestEngine;
@@ -140,4 +143,9 @@ else if (source instanceof ClassSource) {
140143
private static void appendIdeCompatibleLink(StringBuilder message, String className, String methodName) {
141144
message.append("\n at ").append(className).append(".").append(methodName).append("(SourceFile:0)");
142145
}
146+
147+
static boolean handleDiscoveryIssuesInDiscoveryPhase(ConfigurationParameters configurationParameters) {
148+
Optional<String> phase = configurationParameters.get(DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME);
149+
return "discovery".equalsIgnoreCase(phase.orElse(null));
150+
}
143151
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineDiscoveryOrchestrator.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static java.util.stream.Collectors.joining;
1414
import static org.apiguardian.api.API.Status.INTERNAL;
1515
import static org.junit.platform.engine.Filter.composeFilters;
16+
import static org.junit.platform.launcher.core.DiscoveryIssueNotifier.handleDiscoveryIssuesInDiscoveryPhase;
1617

1718
import java.util.Collection;
1819
import java.util.LinkedHashMap;
@@ -109,15 +110,36 @@ public LauncherDiscoveryListener getDiscoveryListener() {
109110
}
110111
};
111112
listener.launcherDiscoveryStarted(request);
113+
LauncherDiscoveryResult discoveryResult;
112114
try {
113115
Map<TestEngine, EngineResultInfo> testEngineResults = discoverSafely(delegatingRequest, phase,
114116
issueCollector, uniqueIdCreator);
115-
return new LauncherDiscoveryResult(testEngineResults, request.getConfigurationParameters(),
117+
discoveryResult = new LauncherDiscoveryResult(testEngineResults, request.getConfigurationParameters(),
116118
request.getOutputDirectoryProvider());
117119
}
118120
finally {
119121
listener.launcherDiscoveryFinished(request);
120122
}
123+
if (handleDiscoveryIssuesInDiscoveryPhase(request.getConfigurationParameters())) {
124+
handleDiscoveryIssues(discoveryResult);
125+
}
126+
return discoveryResult;
127+
}
128+
129+
private static void handleDiscoveryIssues(LauncherDiscoveryResult discoveryResult) {
130+
DiscoveryIssueException exception = null;
131+
for (TestEngine testEngine : discoveryResult.getTestEngines()) {
132+
EngineResultInfo engineResult = discoveryResult.getEngineResult(testEngine);
133+
DiscoveryIssueNotifier discoveryIssueNotifier = engineResult.getDiscoveryIssueNotifier();
134+
discoveryIssueNotifier.logCriticalIssues(testEngine);
135+
discoveryIssueNotifier.logNonCriticalIssues(testEngine);
136+
if (exception == null) {
137+
exception = discoveryIssueNotifier.createExceptionForCriticalIssues(testEngine);
138+
}
139+
}
140+
if (exception != null) {
141+
throw exception;
142+
}
121143
}
122144

123145
private Map<TestEngine, EngineResultInfo> discoverSafely(LauncherDiscoveryRequest request, Phase phase,

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineExecutionOrchestrator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static org.apiguardian.api.API.Status.INTERNAL;
1414
import static org.junit.platform.launcher.LauncherConstants.DRY_RUN_PROPERTY_NAME;
1515
import static org.junit.platform.launcher.LauncherConstants.STACKTRACE_PRUNING_ENABLED_PROPERTY_NAME;
16+
import static org.junit.platform.launcher.core.DiscoveryIssueNotifier.handleDiscoveryIssuesInDiscoveryPhase;
1617
import static org.junit.platform.launcher.core.ListenerRegistry.forEngineExecutionListeners;
1718

1819
import java.util.Optional;
@@ -185,7 +186,10 @@ private static EngineExecutionListener selectExecutionListener(EngineExecutionLi
185186
private void failOrExecuteEngine(LauncherDiscoveryResult discoveryResult, EngineExecutionListener listener,
186187
TestEngine testEngine, NamespacedHierarchicalStore<Namespace> requestLevelStore) {
187188
EngineResultInfo engineDiscoveryResult = discoveryResult.getEngineResult(testEngine);
188-
DiscoveryIssueNotifier discoveryIssueNotifier = engineDiscoveryResult.getDiscoveryIssueNotifier();
189+
DiscoveryIssueNotifier discoveryIssueNotifier = handleDiscoveryIssuesInDiscoveryPhase(
190+
discoveryResult.getConfigurationParameters()) //
191+
? DiscoveryIssueNotifier.NO_ISSUES //
192+
: engineDiscoveryResult.getDiscoveryIssueNotifier();
189193
TestDescriptor engineDescriptor = engineDiscoveryResult.getRootDescriptor();
190194
Throwable failure = engineDiscoveryResult.getCause() //
191195
.orElseGet(() -> discoveryIssueNotifier.createExceptionForCriticalIssues(testEngine));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected EngineDiscoveryResults discoverTests(LauncherDiscoveryRequest request)
8282
return EngineTestKit.discover(this.engine, request);
8383
}
8484

85-
private static LauncherDiscoveryRequestBuilder defaultRequest() {
85+
protected static LauncherDiscoveryRequestBuilder defaultRequest() {
8686
return request() //
8787
.outputDirectoryProvider(dummyOutputDirectoryProvider()) //
8888
.configurationParameter(STACKTRACE_PRUNING_ENABLED_PROPERTY_NAME, String.valueOf(false)) //

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
1717
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_METHOD;
1818
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
19+
import static org.junit.platform.launcher.LauncherConstants.DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME;
1920
import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
2021

2122
import java.util.ArrayList;
@@ -129,6 +130,7 @@ private void performAssertions(Class<?> testClass, Map<String, String> configPar
129130
request()
130131
.selectors(selectClass(testClass))
131132
.configurationParameters(configParams)
133+
.configurationParameter(DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME, "execution")
132134
.build()
133135
);
134136
// @formatter:on

jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/DiscoverySelectorResolverTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,7 @@ private List<UniqueId> uniqueIds() {
819819
}
820820

821821
private LauncherDiscoveryRequestBuilder request() {
822-
return LauncherDiscoveryRequestBuilder.request() //
822+
return defaultRequest() //
823823
.configurationParameter(DEFAULT_DISCOVERY_LISTENER_CONFIGURATION_PROPERTY_NAME, "logging") //
824824
.listeners(discoveryListener);
825825
}

jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/DiscoveryTests.java

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectNestedMethod;
2626
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
2727
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUniqueId;
28-
import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
2928

3029
import java.lang.annotation.Retention;
3130
import java.lang.annotation.RetentionPolicy;
@@ -62,38 +61,39 @@ class DiscoveryTests extends AbstractJupiterTestEngineTests {
6261

6362
@Test
6463
void discoverTestClass() {
65-
LauncherDiscoveryRequest request = request().selectors(selectClass(LocalTestCase.class)).build();
64+
LauncherDiscoveryRequest request = defaultRequest().selectors(selectClass(LocalTestCase.class)).build();
6665
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
6766
assertEquals(7, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
6867
}
6968

7069
@Test
7170
void doNotDiscoverAbstractTestClass() {
72-
LauncherDiscoveryRequest request = request().selectors(selectClass(AbstractTestCase.class)).build();
71+
LauncherDiscoveryRequest request = defaultRequest().selectors(selectClass(AbstractTestCase.class)).build();
7372
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
7473
assertEquals(0, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
7574
}
7675

7776
@Test
7877
void discoverMethodByUniqueId() {
79-
LauncherDiscoveryRequest request = request().selectors(
78+
LauncherDiscoveryRequest request = defaultRequest().selectors(
8079
selectUniqueId(JupiterUniqueIdBuilder.uniqueIdForMethod(LocalTestCase.class, "test1()"))).build();
8180
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
8281
assertEquals(2, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
8382
}
8483

8584
@Test
8685
void discoverMethodByUniqueIdForOverloadedMethod() {
87-
LauncherDiscoveryRequest request = request().selectors(
86+
LauncherDiscoveryRequest request = defaultRequest().selectors(
8887
selectUniqueId(JupiterUniqueIdBuilder.uniqueIdForMethod(LocalTestCase.class, "test4()"))).build();
8988
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
9089
assertEquals(2, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
9190
}
9291

9392
@Test
9493
void discoverMethodByUniqueIdForOverloadedMethodVariantThatAcceptsArguments() {
95-
LauncherDiscoveryRequest request = request().selectors(selectUniqueId(JupiterUniqueIdBuilder.uniqueIdForMethod(
96-
LocalTestCase.class, "test4(" + TestInfo.class.getName() + ")"))).build();
94+
LauncherDiscoveryRequest request = defaultRequest().selectors(
95+
selectUniqueId(JupiterUniqueIdBuilder.uniqueIdForMethod(LocalTestCase.class,
96+
"test4(" + TestInfo.class.getName() + ")"))).build();
9797
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
9898
assertEquals(2, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
9999
}
@@ -102,14 +102,15 @@ void discoverMethodByUniqueIdForOverloadedMethodVariantThatAcceptsArguments() {
102102
void discoverMethodByMethodReference() throws NoSuchMethodException {
103103
Method testMethod = LocalTestCase.class.getDeclaredMethod("test3");
104104

105-
LauncherDiscoveryRequest request = request().selectors(selectMethod(LocalTestCase.class, testMethod)).build();
105+
LauncherDiscoveryRequest request = defaultRequest().selectors(
106+
selectMethod(LocalTestCase.class, testMethod)).build();
106107
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
107108
assertEquals(2, engineDescriptor.getDescendants().size(), "# resolved test descriptors");
108109
}
109110

110111
@Test
111112
void discoverMultipleMethodsOfSameClass() {
112-
LauncherDiscoveryRequest request = request().selectors(selectMethod(LocalTestCase.class, "test1"),
113+
LauncherDiscoveryRequest request = defaultRequest().selectors(selectMethod(LocalTestCase.class, "test1"),
113114
selectMethod(LocalTestCase.class, "test2")).build();
114115

115116
TestDescriptor engineDescriptor = discoverTests(request).getEngineDescriptor();
@@ -121,7 +122,7 @@ void discoverMultipleMethodsOfSameClass() {
121122

122123
@Test
123124
void discoverCompositeSpec() {
124-
LauncherDiscoveryRequest spec = request().selectors(
125+
LauncherDiscoveryRequest spec = defaultRequest().selectors(
125126
selectUniqueId(JupiterUniqueIdBuilder.uniqueIdForMethod(LocalTestCase.class, "test2()")),
126127
selectClass(LocalTestCase.class)).build();
127128

@@ -131,7 +132,7 @@ void discoverCompositeSpec() {
131132

132133
@Test
133134
void discoverTestTemplateMethodByUniqueId() {
134-
LauncherDiscoveryRequest spec = request().selectors(
135+
LauncherDiscoveryRequest spec = defaultRequest().selectors(
135136
selectUniqueId(uniqueIdForTestTemplateMethod(TestTemplateClass.class, "testTemplate()"))).build();
136137

137138
TestDescriptor engineDescriptor = discoverTests(spec).getEngineDescriptor();
@@ -140,7 +141,7 @@ void discoverTestTemplateMethodByUniqueId() {
140141

141142
@Test
142143
void discoverTestTemplateMethodByMethodSelector() {
143-
LauncherDiscoveryRequest spec = request().selectors(
144+
LauncherDiscoveryRequest spec = defaultRequest().selectors(
144145
selectMethod(TestTemplateClass.class, "testTemplate")).build();
145146

146147
TestDescriptor engineDescriptor = discoverTests(spec).getEngineDescriptor();
@@ -153,7 +154,7 @@ void discoverDeeplyNestedTestMethodByNestedMethodSelector() throws Exception {
153154
List.of(TestCaseWithExtendedNested.class, TestCaseWithExtendedNested.ConcreteInner1.class),
154155
AbstractSuperClass.NestedInAbstractClass.class,
155156
AbstractSuperClass.NestedInAbstractClass.class.getDeclaredMethod("test"));
156-
LauncherDiscoveryRequest spec = request().selectors(selector).build();
157+
LauncherDiscoveryRequest spec = defaultRequest().selectors(selector).build();
157158

158159
TestDescriptor engineDescriptor = discoverTests(spec).getEngineDescriptor();
159160

@@ -198,12 +199,12 @@ void reportsWarningForTestClassWithInvalidTestMethod(LauncherDiscoveryRequest re
198199
static List<Named<LauncherDiscoveryRequest>> requestsForTestClassWithInvalidTestMethod() {
199200
return List.of( //
200201
named("directly selected",
201-
request().selectors(selectClass(InvalidTestCases.InvalidTestMethodTestCase.class)).build()), //
202-
named("indirectly selected", request() //
202+
defaultRequest().selectors(selectClass(InvalidTestCases.InvalidTestMethodTestCase.class)).build()), //
203+
named("indirectly selected", defaultRequest() //
203204
.selectors(selectPackage(InvalidTestCases.InvalidTestMethodTestCase.class.getPackageName())) //
204205
.filters(includeClassNamePatterns(
205206
Pattern.quote(InvalidTestCases.InvalidTestMethodTestCase.class.getName()))).build()), //
206-
named("subclasses", request() //
207+
named("subclasses", defaultRequest() //
207208
.selectors(selectClass(InvalidTestCases.InvalidTestMethodSubclass1TestCase.class),
208209
selectClass(InvalidTestCases.InvalidTestMethodSubclass2TestCase.class)) //
209210
.build()) //
@@ -229,14 +230,14 @@ void reportsWarningForInvalidStandaloneTestClass(LauncherDiscoveryRequest reques
229230
static List<Arguments> requestsForTestClassWithInvalidStandaloneTestClass() {
230231
return List.of( //
231232
argumentSet("directly selected",
232-
request().selectors(selectClass(InvalidTestCases.InvalidTestClassTestCase.class)).build(),
233+
defaultRequest().selectors(selectClass(InvalidTestCases.InvalidTestClassTestCase.class)).build(),
233234
InvalidTestCases.InvalidTestClassTestCase.class), //
234-
argumentSet("indirectly selected", request() //
235+
argumentSet("indirectly selected", defaultRequest() //
235236
.selectors(selectPackage(InvalidTestCases.InvalidTestClassTestCase.class.getPackageName())) //
236237
.filters(includeClassNamePatterns(
237238
Pattern.quote(InvalidTestCases.InvalidTestClassTestCase.class.getName()))).build(), //
238239
InvalidTestCases.InvalidTestClassTestCase.class), //
239-
argumentSet("subclass", request() //
240+
argumentSet("subclass", defaultRequest() //
240241
.selectors(selectClass(InvalidTestCases.InvalidTestClassSubclassTestCase.class)) //
241242
.build(), //
242243
InvalidTestCases.InvalidTestClassSubclassTestCase.class) //
@@ -262,8 +263,8 @@ void reportsWarningForInvalidNestedTestClass(LauncherDiscoveryRequest request) {
262263
static List<Named<LauncherDiscoveryRequest>> requestsForTestClassWithInvalidNestedTestClass() {
263264
return List.of( //
264265
named("directly selected",
265-
request().selectors(selectClass(InvalidTestCases.InvalidTestClassTestCase.Inner.class)).build()), //
266-
named("subclass", request() //
266+
defaultRequest().selectors(selectClass(InvalidTestCases.InvalidTestClassTestCase.Inner.class)).build()), //
267+
named("subclass", defaultRequest() //
267268
.selectors(selectNestedClass(List.of(InvalidTestCases.InvalidTestClassSubclassTestCase.class),
268269
InvalidTestCases.InvalidTestClassTestCase.Inner.class)) //
269270
.build()) //

platform-tests/src/test/java/org/junit/platform/jfr/FlightRecordingDiscoveryListenerIntegrationTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId
5757
EngineTestKit.discover(testEngine, request() //
5858
.selectors(selectClass(FlightRecordingDiscoveryListenerIntegrationTests.class)) //
5959
.listeners(new FlightRecordingDiscoveryListener()) //
60+
.enableImplicitConfigurationParameters(false) //
6061
.build());
6162

6263
jfrEvents.awaitEvents();

platform-tests/src/test/java/org/junit/platform/launcher/core/DefaultLauncherTests.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,55 @@ public void execute(ExecutionRequest request) {
948948
LauncherConstants.CRITICAL_DISCOVERY_ISSUE_SEVERITY_PROPERTY_NAME);
949949
}
950950

951+
@Test
952+
void failsDuringDiscoveryIfConfigurationParameterIsSetAccordingly() {
953+
954+
var engine = new TestEngineStub("engine-id") {
955+
@Override
956+
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
957+
var listener = discoveryRequest.getDiscoveryListener();
958+
listener.issueEncountered(uniqueId, DiscoveryIssue.create(Severity.ERROR, "error"));
959+
return new EngineDescriptor(uniqueId, "Engine");
960+
}
961+
};
962+
963+
var exception = assertThrows(DiscoveryIssueException.class, () -> execute(engine, request -> request //
964+
.configurationParameter(LauncherConstants.DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME, "discovery")));
965+
966+
assertThat(exception) //
967+
.isInstanceOf(DiscoveryIssueException.class) //
968+
.hasMessageStartingWith(
969+
"TestEngine with ID 'engine-id' encountered a critical issue during test discovery") //
970+
.hasMessageContaining("(1) [ERROR] error");
971+
}
972+
973+
@ParameterizedTest
974+
@ValueSource(strings = { "discovery", "execution" })
975+
void logsNonCriticalIssuesOnlyOnce(String phase, @TrackLogRecords LogRecordListener listener) {
976+
977+
var engine = new TestEngineStub("engine-id") {
978+
@Override
979+
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
980+
var listener = discoveryRequest.getDiscoveryListener();
981+
listener.issueEncountered(uniqueId, DiscoveryIssue.create(Severity.WARNING, "warning"));
982+
return new EngineDescriptor(uniqueId, "Engine");
983+
}
984+
985+
@Override
986+
public void execute(ExecutionRequest request) {
987+
var executionListener = request.getEngineExecutionListener();
988+
var engineDescriptor = request.getRootTestDescriptor();
989+
executionListener.executionStarted(engineDescriptor);
990+
executionListener.executionFinished(engineDescriptor, successful());
991+
}
992+
};
993+
994+
execute(engine, request -> request //
995+
.configurationParameter(LauncherConstants.DISCOVERY_ISSUE_FAILURE_PHASE_PROPERTY_NAME, phase));
996+
997+
assertThat(listener.stream(DiscoveryIssueNotifier.class, Level.WARNING)).hasSize(1);
998+
}
999+
9511000
private static ReportedData execute(TestEngine engine) {
9521001
return execute(engine, identity());
9531002
}

0 commit comments

Comments
 (0)