11
11
package org .junit .platform .launcher .core ;
12
12
13
13
import static java .util .Objects .requireNonNull ;
14
+ import static java .util .function .UnaryOperator .identity ;
14
15
import static org .assertj .core .api .Assertions .assertThat ;
15
16
import static org .junit .jupiter .api .Assertions .assertAll ;
16
17
import static org .junit .jupiter .api .Assertions .assertEquals ;
19
20
import static org .junit .platform .commons .util .CollectionUtils .getOnlyElement ;
20
21
import static org .junit .platform .engine .SelectorResolutionResult .unresolved ;
21
22
import static org .junit .platform .engine .TestExecutionResult .successful ;
23
+ import static org .junit .platform .engine .discovery .DiscoverySelectors .selectClass ;
22
24
import static org .junit .platform .engine .discovery .DiscoverySelectors .selectPackage ;
23
25
import static org .junit .platform .engine .discovery .DiscoverySelectors .selectUniqueId ;
26
+ import static org .junit .platform .fakes .FaultyTestEngines .createEngineThatCannotResolveAnything ;
27
+ import static org .junit .platform .fakes .FaultyTestEngines .createEngineThatFailsToResolveAnything ;
24
28
import static org .junit .platform .launcher .LauncherConstants .DRY_RUN_PROPERTY_NAME ;
25
29
import static org .junit .platform .launcher .core .LauncherDiscoveryRequestBuilder .DEFAULT_DISCOVERY_LISTENER_CONFIGURATION_PROPERTY_NAME ;
26
30
import static org .junit .platform .launcher .core .LauncherDiscoveryRequestBuilder .request ;
38
42
import java .time .Instant ;
39
43
import java .util .Set ;
40
44
import java .util .concurrent .atomic .AtomicReference ;
45
+ import java .util .function .UnaryOperator ;
41
46
import java .util .logging .Level ;
42
47
import java .util .logging .LogRecord ;
43
48
@@ -844,7 +849,47 @@ public void execute(ExecutionRequest request) {
844
849
.isBetween (result .startTime (), result .finishTime ());
845
850
}
846
851
852
+ @ Test
853
+ void reportsEngineExecutionFailureOnUnresolvedUniqueIdSelectorWithEnginePrefix () {
854
+ var engine = createEngineThatCannotResolveAnything ("some-engine" );
855
+ var selector = selectUniqueId (UniqueId .forEngine (engine .getId ()));
856
+ var result = execute (engine , request -> request .selectors (selector ));
857
+
858
+ assertThat (result .testExecutionResult ().getStatus ()).isEqualTo (Status .FAILED );
859
+ assertThat (result .testExecutionResult ().getThrowable ().orElseThrow ()) //
860
+ .hasMessageStartingWith (
861
+ "TestEngine with ID 'some-engine' encountered a critical issue during test discovery" ) //
862
+ .hasMessageContaining ("(1) [ERROR] %s could not be resolved" , selector );
863
+ }
864
+
865
+ @ Test
866
+ void ignoresUnresolvedUniqueIdSelectorWithoutEnginePrefix () {
867
+ var engine = createEngineThatCannotResolveAnything ("some-engine" );
868
+ var selector = selectUniqueId (UniqueId .forEngine ("some-other-engine" ));
869
+ var result = execute (engine , request -> request .selectors (selector ));
870
+
871
+ assertThat (result .testExecutionResult ().getStatus ()).isEqualTo (Status .SUCCESSFUL );
872
+ }
873
+
874
+ @ Test
875
+ void reportsEngineExecutionFailureForSelectorResolutionFailure () {
876
+ var engine = createEngineThatFailsToResolveAnything ("some-engine" , new RuntimeException ("boom" ));
877
+ var selector = selectClass (Object .class );
878
+ var result = execute (engine , request -> request .selectors (selector ));
879
+
880
+ assertThat (result .testExecutionResult ().getStatus ()).isEqualTo (Status .FAILED );
881
+ assertThat (result .testExecutionResult ().getThrowable ().orElseThrow ()) //
882
+ .hasMessageStartingWith (
883
+ "TestEngine with ID 'some-engine' encountered a critical issue during test discovery" ) //
884
+ .hasMessageContaining ("(1) [ERROR] %s resolution failed" , selector ) //
885
+ .hasMessageContaining ("Cause: java.lang.RuntimeException: boom" );
886
+ }
887
+
847
888
private static ReportedData execute (TestEngine engine ) {
889
+ return execute (engine , identity ());
890
+ }
891
+
892
+ private static ReportedData execute (TestEngine engine , UnaryOperator <LauncherDiscoveryRequestBuilder > configurer ) {
848
893
var executionListener = mock (TestExecutionListener .class );
849
894
850
895
AtomicReference <Instant > startTime = new AtomicReference <>();
@@ -859,9 +904,9 @@ private static ReportedData execute(TestEngine engine) {
859
904
return null ;
860
905
}).when (executionListener ).executionFinished (any (), any ());
861
906
862
- var request = request () //
863
- .configurationParameter (DEFAULT_DISCOVERY_LISTENER_CONFIGURATION_PROPERTY_NAME , "logging" ) //
864
- .build ();
907
+ var builder = request () //
908
+ .configurationParameter (DEFAULT_DISCOVERY_LISTENER_CONFIGURATION_PROPERTY_NAME , "logging" );
909
+ var request = configurer . apply ( builder ) .build ();
865
910
var launcher = createLauncher (engine );
866
911
867
912
var testPlan = launcher .discover (request );
0 commit comments